spring 的事务问题,事务失效,事务传播


1:同一个类,如下图,我们调  service.methodA(),这时的话 methodA和 methodB都在 A定义的 事务内,只有在methodA 的方法里throws  RuntimeException 时 才会回滚,methodA和methodB都会回滚。(注意:如果methodB抛出RuntimeException,但是methodA中把这种异常捕获,并让程序正常运行,则都不会发生回滚。)

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片

  1. Service {  

  2.      @Transactional  
  3.      void methodA() {  
  4.          methodB();  
  5.      }
  6.    
  7.      void methodB(){
  8.      }
  9. }  
  10.     


2:如下图,我们调  service.methodA(),  methodB上面的事务是不生效(其他的几个注解也不会生效)。可以简单的这么理解:spring 无法找到methodB 这个切面,无法收到事务通知。具体解释见下面的博客:http://blog.csdn.net/seelye/article/details/40144817

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片

  1. Service {  

  2.        
  3.      void methodA() {  
  4.          methodB();  
  5.      }
  6.    
  7.      @Transactional
  8.      void methodB(){
  9.      }
  10. }  
  11.     



3:正常的话,我们两个方法都定义事务的话,就要把这两个方法放在不同的service里面。如下面:

可以把方法B放到另外一个service或者dao,然后把这个server或者dao通过@Autowired注入到方法A的bean里面,这样即使方法A没用事务,方法B也可以执行自己的事务了。AOP就是这么玩的!


[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. ServiceA {  
  2.          
  3.      void methodA() {  
  4.          ServiceB.methodB();  
  5.      }  
  6.     
  7. }  
  8.     
  9. ServiceB {  
  10.          
  11.      void methodB() {  
  12.      }  
  13.          
  14. }  


4:

Spring中事务的定义:

Propagationkey属性确定代理应该给哪个方法增加事务行为。这样的属性最重要的部份是传播行为。)有以下选项可供使用:

  • PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
  • PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
  • PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。 
  • PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。 
  • PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 
  • PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值