首页 > 代码库 > Spring中的事务管理

Spring中的事务管理

一、Spring事务管理用到的三个接口

a. PlatformTransactionManager 事务管理器

b. TransactionDefinition 事务定义信息(隔离、传播、超时、只读)

c. TransactionStatus 事务具体的运行状态

二、Spring为不同的持久化框架提供了不同的PlatformTransactionManager接口实现

事务 说明
org.springframework.jdbc.datasource.DataSourceTransactionManager 使用Spring JDBC或iBatis进行持久化数据时使用
org.springframework.orm.hibernate5.HibernateTransactionManager 使用Hibernate5.0版本进行持久化数据时使用
org.springframework.orm.jpa.JpaTransactionManager 使用JPA进行持久化时使用
org.springframework.jdo.JdoTransactionManager 当持久化机制是Jdo时使用
org.springframework.transaction.jta.JtaTransactionManager 使用一个JTA实现来管理事务,在一个事务跨越多个资源时必须使用

三、Spring进行事务配置

1. 基于xml配置文件

2. 基于注解的方式

还有一种是利用编程的方式进行的,这里就不演示了。

四、搭建银行转账的环境

也就是有JdbcTemplate、AccountService、AcountDao和C3P0的DataSource的配置,并在AccountService的一个方法中进行一个转账操作。

五、基于xml配置的方式

a. 在bean.xml中配置事务管理器

  1 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  2     <!-- 指定对哪个数据源进行操作的 -->
  3     <!-- 属性注入 -->
  4     <property name="dataSource" ref="dataSource"></property>
  5 </bean>

b. 配置事务的增强

  1 <!-- 配置事务增强 -->
  2 <tx:advice id="txAdvice" transactionManager="transactionManager">
  3     <tx:attributes>
  4 
  5         <!-- name属性是增强方法的名称,propagation是传播行为 -->
  6         <!-- 匹配增强方法的规则 -->
  7         <!-- 这部分结构的规则是固定的,只需要改方法的匹配 -->
  8         <tx:method name="account*" propagation="REQUIRED" />
  9 
 10     </tx:attributes>
 11 </tx:advice>

c. 配置切入点和切面

  1 <!-- 配置切入点和切面 -->
  2 <aop:config>
  3     <!-- 切入点 -->
  4     <aop:pointcut expression="execution(* 全类名.*(..))" id="pointcut1" />
  5     <!-- 切面 -->
  6     <aop:advisor advice-ref="txadvice" pointcut-ref="pointcut1" />
  7 </aop:config>

最好将这三个整合起来放到数据库连接池的配置后面

  1 <!-- 配置事务管理器  -->
  2 <bean id="transactionManager" class="org.springframework.jdbc.dataSource.DataSourceTransactionManager">
  3     <!-- 指明对哪个数据库进行操作 -->
  4     <property name="dataSource" ref="dataSource"></property>
  5 </bean>
  6 
  7 <!-- 配置事务增强 -->
  8 <tx:advice id="txAdvice" transactionManager="transactionManager">
  9     <tx:attributes>
 10 
 11         <!-- name属性是增强方法的名称,propagation是传播行为 -->
 12         <!-- 匹配增强方法的规则 -->
 13         <!-- 这部分结构的规则是固定的,只需要改方法的匹配 -->
 14         <tx:method name="account*" propagation="REQUIRED" />
 15 
 16     </tx:attributes>
 17 </tx:advice>
 18 
 19 <!-- 配置切入点和切面 -->
 20 <aop:config>
 21     <!-- 切入点 -->
 22     <aop:pointcut expression="execution(* 全类名.*(..))" id="pointcut1" />
 23     <!-- 切面 -->
 24     <aop:advisor advice-ref="txadvice" pointcut-ref="pointcut1" />
 25 </aop:config>

写完这个之后,一般要修改的地方就在于配置事务的增强管理器以及被增强的方法可以改,其他的不用怎么改。

六、以及注解的方式配置

注解的配置方式要比配置文件简单方便得多。

a. 配置事务管理器

  1 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  2     <!-- 指定对哪个数据源进行操作的 -->
  3     <!-- 属性注入 -->
  4     <property name="dataSource" ref="dataSource"></property>
  5 </bean>

b. 开启事务注解

  1 <!-- 开启事务注解 -->
  2 <tx:annotation-driven transaction-manager="transactionManager" />

c. 在具体使用事务的方法所在的类上添加注解

@Transactional,但是这一步很容易忘记。

  1 @Transactional
  2 public void accountMoney() {
  3 
  4 }

总结:

1. 用Spring来进行事务管理还是很方便的,利用文件配置写的多,但是很多都是死的,利用注解来配置就很简单了;

2. 总结下注解的使用,比如context,aop或者tx,都需要先在配置文件中有开启注解的操作;

3. Spring啥时候会提交,啥时候会回滚呢?是发生异常的时候?那我们岂不是没有控制事务的管理权了,如果交给Spring管理的话?

Spring中的事务管理