spring系列 事务管理

spring系列 事务管理

Posted by julyerr on March 2, 2018

事务的概念参见


Spring中事务定义方式

spring 支持注解式和声明式两种方式配置事务管理

注解式
三步骤

  • 配置事务管理器
  • 配置注解驱动
  • 在方法上加入@Transactional注解
<!-- 配置事务管理器 -->
<!--jdbc事务管理器是DataSourceTransactionManager -->
 <bean id="transactionManager" 
  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"></property>
 </bean>
  
 <!-- 启用事务注解 -->
 //proxy-target-class:表示将使用的代码机制,默认false表示使用JDK代理,如果为true将使用CGLIB代理
 <tx:annotation-driven transaction-manager="transactionManager"/>

@Transaction 支持的可选参数

  • value 指定事务管理器名字,默认使用<tx:annotation-driven/>指定的事务管理器,用于支持多事务管理器环境;
  • isolation 指定事务隔离级别,默认为“DEFAULT”,使用Isolation.DEFAULT指定;
  • readOnly 指定事务是否只读,默认false表示事务非只读;
  • timeout 指定事务超时时间,以秒为单位,默认-1表示事务超时将依赖于底层事务系统;
  • rollbackFor 指定一组异常类,遇到该类异常将回滚事务;
  • rollbackForClassname 指定一组异常类名字,其含义与中的rollback-for属性语义完全一样;
  • noRollbackFor 指定一组异常类,即使遇到该类异常也将提交事务,即不回滚事务;
  • noRollbackForClassname 指定一组异常类名字,其含义与中的no-rollback-for属性语义完全一样;
  • propagation 指定事务传播行为,默认为Required,使用Propagation.REQUIRED指定; 上图详细全面总结了不同事务传播行为的特点,其中REQUIRES_NEW 和 NESTED 区别主要在于,Nested嵌套事务回滚或提交不会导致外部事务回滚或提交,但外部事务回滚将导致嵌套事务回滚,而 RequiresNew由于都是全新的事务,所以内外事务之间是无关联的。

required 和 required_new较为常用

notes

  • 在接口、实现类或方法上都指定了@Transactional 注解,则优先级顺序为方法>实现类>接口。
  • 建议只在实现类或实现类的方法上使用@Transactional,而不要在接口上使用。接口上的@Transactional注解是“不能继承的”,基于CGLIB代理机制就会出现问题。

声明式
不需要对原有的业务做任何修改,通过在XML文件中定义需要拦截方法的匹配即可完成配置

<!-- 1. 配置事务管理器 -->
 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"></property>
 </bean>
  
 <!-- 2. 配置事务属性 -->
 <tx:advice id="txAdvice" transaction-manager="transactionManager">
  <tx:attributes>
   <!-- 根据方法名指定事务的属性 -->
   <tx:method name="purchase" propagation="REQUIRES_NEW"/>
   <tx:method name="get*" read-only="true"/>
   <tx:method name="find*" read-only="true"/>
   <tx:method name="*"/>
  </tx:attributes>
 </tx:advice>
  
 <!-- 3. 配置事务切入点, 以及把事务切入点和事务属性关联起来 -->
 <aop:config>
  <aop:pointcut expression="execution(* com.atguigu.spring.tx.xml.service.*.*(..))" 
   id="txPointCut"/>
  <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/> 
 </aop:config>

参考资料