一、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 管理的话?
来源: http://www.bubuko.com/infodetail-1966295.html