Spring事务管理详解

事务的四个特性:A原子性 D持久性 I隔离性 C一致性

隔离级别:Read-Uncommited(读未提交的一行数据:脏读、不可重复读、幻读)
                   Read-Commited (读已提交的一行数据:不可重复读、幻读)
                   Read-Repeatable (可重复读已提交的一行数据:幻读)----MySQL默认Default
                    Serialization (序列化)

对于Dao层(持久化)的操作,高并发时,容易造成数据出错(银行转账:一方扣款,然后出异常(不回滚),另一方没办法收款----总金额减少)

事务管理出现在------Service层

Spring对事务管理的支持-----DataSourceTransactionManager(JDBC,Mybatis)、HibernateTransactionManager(Hibernate)

使用事务管理器
1.编程式引入事务管理
一、AplicationContext注入依赖---引入事务管理模板----Service类引入事务管理模板---Service类中引入事务:
   
   
  1. <bean id="transactionManager" Class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  2. <property name="dataSource" ref="dataSource"/><!-- c3p0连接池的bean -->
  3. </bean>
  4. <!-- 配置事务管理模板:Spring为简化事务管理而提供的类 -->
  5. <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
  6. <property name="transactionManager" ref="transactionManager"/>
  7. </bean>
  8. <!-- Service类 -->
  9. <bean id="XXXService" class="xxxServiceImpl">
  10. <property name="xxxDao" ref="xxxDao">
  11.  <!-- 引入事务管理模板 -->
  12. <property name="transactionTemplate" ref="transactionTemplate">
  13. </bean>

二、ServiceImpl类中的方法引入事务:
   
   
  1. //注入事务模板
  2. private TransacitonTemplate transactionTemplate;
  3. public void setTransactionTemplate(TransactionTemplate transactionTemplate){
  4. this.transactionTemplate = transactionTemplate;
  5. }
  6. //需要引入事务的方法
  7. public void transfer(final String out,final String in,final Double money){
  8. transactionTemplate.execute(new TransactionCallbackWithoutResult(){
  9. @Override
  10. protected void doInTransactionWithoutResult(TransactionStatus ts){
  11. //里面写要执行事务的操作
  12. //若成功则成功,若失败则回滚
  13. }
  14. })
  15. }
三、Test.java中注入XXXService 测试调用事务方法

      
      
  1. //注入代理类
  2. @Resource(name="xxxService")
  3. private XXXService xxxService;
  4. //测试方法中:
  5. xxxService.transfer("aaa","bbb",200);


2.声明式事务管理一(基于transactionProxyFactoryBean的方式)---AOP思想(引入AOP的jar包:1.spring-aop 2.com.springsource.org.aopalliance)
一、ApplictionContext中注入transactionManager----注入ServiceImpl的代理类xxxServiceProxy(注入事务目标对象、注入事务管理器、注入事务隔离级别)

   
   
  1. <bean id="transactionManager" Class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  2. <property name="dataSource" ref="dataSource"/><!-- c3p0连接池的bean -->
  3. </bean>
  4. <!-- 配置Service层代理类 -->
  5. <bean id = "xxxServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  6. <!--配置目标对象 -->
  7. <property name="target" ref="xxxService"/>
  8. <!--注入事务管理器 -->
  9. <property name="transactionManager" ref="transactionManager"/>
  10. <!-- 注入事务隔离级别、属性 -->
  11. <property name="TransactionAttributes">
  12. <props>
  13. <!-- 格式:key=”insert*“即以insert开头的方法
  14. * PROPAGATION : 事务传播行为
  15. * ISOLATION : 事务的隔离级别
  16. * readOnly : 只读(不可修改)
  17. * -Exception : 发生哪些异常后回滚事务再提交
  18. * +Exception : 发生哪些异常后不回滚事务直接提交
  19. -->
  20. <prop key="transfer*">PROPAGATION_REQUIRED</prop>
  21. <prop key="update*">PROPAGATION_REQUIRED</prop>
  22. <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
  23. </props>
  24. </property>
  25. </bean>

二、XXXserviceImpl.java中写事务方法
   
   
  1. //需要引入事务的方法
  2. public void transfer(String out,String in,Double money){
  3. //里面写要执行事务的操作
  4. //若成功则成功,若失败则回滚
  5. }


三、Test.java中注入 xxxServiceProxy代理bean测试调用事务方法

   
   
  1. //注入代理类
  2. @Resource(name="xxxServiceProxy")
  3. private XXXService xxxService;
  4. //测试方法中:
  5. xxxService.transfer("aaa","bbb",200);


3.声明式事务管理二(基于AspectJ的XML方式)---设置切面---》放入事务管理
引入aspectj和spring-aspects的jar包,ApplicationContext引入aop、tx命名空间

   
   
  1. <!-- 配置事务管理 -->
  2. <bean id="transactionManager" Class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  3. <property name="dataSource" ref="dataSource"/><!-- c3p0连接池的bean -->
  4. </bean>
  5. <!-- 配置事务的通知:(事务的增强) -->
  6. <tx:advice id="txAdvice" transaction-manager="transactionManager">
  7. <tx:attributes>
  8. <!-- prpagation:事务传播行为
  9.   isolation:事务的隔离级别
  10.   read-only:只读(不可修改)
  11. rollback-for:发生哪些异常后回滚事务再提交
  12. no-rollback-for:发生哪些异常后不回滚事务直接提交
  13. timeout:过期
  14. -->
  15. <tx:method name="transfer" prpagation="REQUIRED"/isolation="DEFAULT" read-only="false" rollback-for="" timeout="-1" no-rollback-for=""/>
  16. </tx:attributes>
  17. </tx:advice>
  18. <!-- 配置切面 -->
  19. <aop:config>
  20. <!-- 配置切入点 -->
  21. <aop:pointcut expression="execution(* com....XXXService+.*(..))" id="pointcut1"/> id="pointcut1">
  22. <!-- 配置切面 -->
  23. <aop:advisor advice-ref="txAdvice" piontcut-ref="pointcut1"/>
  24. </aop:config>
  25. </bean>

二、XXXserviceImpl.java中写事务方法
   
   
  1. //需要引入事务的方法
  2. public void transfer(String out,String in,Double money){
  3. //里面写要执行事务的操作
  4. //若成功则成功,若失败则回滚
  5. }
三、Test.java中注入XXXService 测试调用事务方法

    
    
  1. //注入代理类
  2. @Resource(name="xxxService")
  3. private XXXService xxxService;
  4. //测试方法中:
  5. xxxService.transfer("aaa","bbb",200);

3.声明式事务管理三(基于注解的方式)

一、ApplicationContext配置事务管理-----开启注解事务驱动
   
   
  1. <!-- 配置事务管理 -->
  2. <bean id="transactionManager" Class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  3. <property name="dataSource" ref="dataSource"/><!-- c3p0连接池的bean -->
  4. </bean>
  5. <!-- 开启注解事务驱动 -->
  6. <tx:annotation-driven transaction-manager="transactionManager"/>
  7. </bean>


二、 XXXserviceImpl.java类中加上@Transactional注解,写事务方法

  
  
  1. /**
  2. propagation
  3. isolation
  4. rollback
  5. readOnly
  6. noRollbackFor
  7. */
  8. @Transactional(propagation="" isolation="" rollbackFor="" readOnly="" noRollbackFor="")
  9. public class XXXServiceImpl implement XXXService{
  10.  
  11. .......
  12. //需要引入事务的方法
  13. public void transfer(String out,String in,Double money){
  14. //里面写要执行事务的操作
  15. //若成功则成功,若失败则回滚
  16. }
  17. }

三、Test.java中注入XXXService 测试调用事务方法

   
   
  1. //注入代理类
  2. @Resource(name="xxxService")
  3. private XXXService xxxService;
  4. //测试方法中:
  5. xxxService.transfer("aaa","bbb",200);







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值