spring配置事物的四种方式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/WiteWater/article/details/80801385

首先介绍一下事物的特性:ACID

1、原子性:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生

2、一致性:指事务前后数据的完整性必须保持一致。

3、隔离性:指多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间数据要相互隔离。

4、持久性:指一个事务一旦被提交,它对数据库中的数据的改变就是永久性的,即使数据库发生故障也不会其有任何影响。

然后介绍一下spring对事务的管理:(编程式事务+声明式事务)

spring事务管理高层抽象主要包括三个接口

Platform TransactionManager  事务管理器

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

   使用Spring JDBC 或 iBatis进行持久化数据时使用DataSourceTransactionManager

   使用Hibernate3.0进行持久化数据时使用HibernateTransactionManager 

   

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


Mysql默认采用REPEATABLE_READ隔离级别;Oracle默认采用READ_COMMITTED隔离级别


TransactionStatus 事务具体运行状态


其次,介绍spring提供的事务控制方法:

1、编程式事务管理 ,利用TransactionTemplate将多个Dao操作封装起来

代码如下:

  1. <!-- 配置事务管理器 -->  
  2.     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
  3.         <property name="dataSource" ref="dataSource" />  
  4.     </bean>  
  5.       
  6.     <!-- 配置事务管理的模板:Spring为了简化事务管理的代码而提供的类 -->  
  7.     <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">  
  8.         <property name="transactionManager" ref="transactionManager"/>  
  9.     </bean>  
Dao 需要注入  private  TransactionTemplate transactionTemplate;

  1.  transactionTemplate.execute(new TransactionCallbackWithoutResult() {  
  2.   
  3.             @Override  
  4.             protected void doInTransactionWithoutResult(  
  5.                     TransactionStatus transactionStatus) {  
  6.                  //处理业务代码
  7.             }  
  8.         });  


2、声明式事务管理(基于spring的AOP配置控制)

a、基于TransactionProxyFactoryBean的方式 

      需要为每个进行事务管理的类,配置一个TransactionProxyFactoryBean进行增强

  1. <!-- 配置业务层的代理 -->  
  2.     <bean id="userServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">  
  3.         <!-- 配置目标对象  userService是注入事务的service层-->  
  4.         <property name="target" ref="userService" />  
  5.         <!-- 注入事务管理器 -->  
  6.         <property name="transactionManager" ref="transactionManager"></property>  
  7.         <!-- 注入事务的属性 -->  
  8.         <property name="transactionAttributes">  
  9.             <props>  
  10.                 <!--key指需要事务的方法 
  11.                     prop的格式:  
  12.                         * PROPAGATION   :事务的传播行为  
  13.                         * ISOTATION     :事务的隔离级别  
  14.                         * readOnly      :只读  
  15.                         * -EXCEPTION    :发生哪些异常回滚事务  
  16.                         * +EXCEPTION    :发生哪些异常不回滚事务  
  17.                  -->  
  18.                 <prop key="update">PROPAGATION_REQUIRED</prop>   
  19.             </props>  
  20.         </property>  
  21.     </bean>  

使用是要用增强的代理类  userServiceProxy

b、基于xml配置  无需修改代码但需要引入aop声名和tx声名

  1. <!-- 配置事务的通知 -->  
  2.     <tx:advice id="txAdvice" transaction-manager="transactionManager">  
  3.         <tx:attributes>  
  4.             <!--   
  5.                 propagation :事务传播行为  
  6.                 isolation   :事务的隔离级别  
  7.                 read-only   :只读  
  8.                 rollback-for:发生哪些异常回滚  
  9.                 no-rollback-for :发生哪些异常不回滚  
  10.                 timeout     :过期信息  
  11.              -->  
  12.             <tx:method name="update" propagation="REQUIRED"/>  
  13.         </tx:attributes>  
  14.     </tx:advice>  
  15.       
  16.     <!-- 配置切面 -->  
  17.     <aop:config>  
  18.         <!-- 配置切入点 -->  
  19.         <aop:pointcut expression="execution(* com.*.UserService+.*(..))" id="pointcut"/>  
  20.         <!-- 配置切面 -->  
  21.         <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>  
  22.     </aop:config>  

c、基于注解

  1. <!-- 开启注解事务 -->  
  2.     <tx:annotation-driven transaction-manager="transactionManager"/>  
在目标组件类中使用@Transactional,该标记可定义在类前或方法前。

猜你喜欢

转载自blog.csdn.net/WiteWater/article/details/80801385
今日推荐