spring事务配置方式

spring支持编程式事务管理和声明式事务管理两种方式。

        编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。

        声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。

       显然声明式事务管理要优于编程式事务管理,这正是spring倡导的非侵入式的开发方式。声明式事务管理使业务代码不受污染,一个普通的POJO对象,只要加上注解就可以获得完全的事务支持。和编程式事务相比,声明式事务唯一不足地方是,后者的最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。但是即便有这样的需求,也存在很多变通的方法,比如,可以将需要进行事务管理的代码块独立为方法等等。

         声明式事务管理也有两种常用的方式,一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解。显然基于注解的方式更简单易用,更清爽。

  • myBatis为例   基于注解的声明式事务管理配置@Transactional

  1.  <!-- 配置spring的PlatformTransactionManager,名字为默认值 -->  
  2.     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
  3.         <property name="dataSource" ref="dataSource" />  
  4.     </bean>  
  5.       
  6.     <!-- 开启事务控制的注解支持 -->  
  7.     <tx:annotation-driven transaction-manager="transactionManager"/></span></span>  

@Transactional注解

用法

       @Transactional 可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。

         虽然 @Transactional 注解可以作用于接口、接口方法、类以及类方法上,但是 Spring 建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。另外, @Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。如果你在 protected、private 或者默认可见性的方法上使用 @Transactional 注解,这将被忽略,也不会抛出任何异常。

        默认情况下,只有来自外部的方法调用才会被AOP代理捕获,也就是,类内部方法调用本类内部的其他方法并不会引起事务行为,即使被调用方法使用@Transactional注解进行修饰。

  • myBatis为例   基于注解的声明式事务管理配置,xml配置

主要为aop切面配置,只看xml就可以了

[html]  view plain  copy
  1. <!-- 事物切面配置 -->  
  2. <tx:advice id="advice" transaction-manager="transactionManager">  
  3.     <tx:attributes>  
  4.         <tx:method name="update*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/>  
  5.         <tx:method name="insert" propagation="REQUIRED" read-only="false"/>  
  6.     </tx:attributes>  
  7. </tx:advice>  
  8.   
  9. <aop:config>  
  10.     <aop:pointcut id="testService" expression="execution (* com.baobao.service.MyBatisService.*(..))"/>  
  11.     <aop:advisor advice-ref="advice" pointcut-ref="testService"/>  
  12. </aop:config>  

猜你喜欢

转载自blog.csdn.net/qq_30764991/article/details/80502941