您的位置:首页 > 编程语言 > Java开发

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

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

[java] view
plain copy

 





Service {  

     @Transactional  

     void methodA() {  

 
4000
       methodB();  

     }

   

     void methodB(){

     }

}  

    

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

[java] view
plain copy

 





Service {  

       

     void methodA() {  

         methodB();  

     }

   

     @Transactional

     void methodB(){

     }

}  

    

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

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



[java] view
plain copy

 





ServiceA {  

         

     void methodA() {  

         ServiceB.methodB();  

     }  

    

}  

    

ServiceB {  

         

     void methodB() {  

     }  

         

}  

4:

Spring中事务的定义:


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

PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。 

PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。 

PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 

PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring 事务