事务传播的几种情况

1、 当在外层方法设置了Required ,内部多个方法不设置,当内部有一个发生异常,就会发生回滚,并且两者都会回滚。其实可以理解为,被Required修饰的方法,里面的子方法都会被加上事务,有一个子方法异常,全部回滚。

 

2、 当子方法使用了Support,但是外层又没有事务,此时就忽略外层的。如果外层是Required,那么子方法就有事务。

 

3、 Mandatory 如果父级方法没有项目,子方法会抛出异常,强制性的调用方必须有事务。

 

4、 Requied_new 如果当前有事务,会挂起当前的事务,然后执行新事务。

  a.父方法使用了required ,子方法使用required_new ,当子方法发生异常的时候,那么父方法会发生回滚吗?

  答案:会发生回滚,子方法虽创建了一个新的事务,但是当子方法发生异常导致回滚的时候,实际上调用它的父方法,也会收到一个异常,就会影响父方法的执行,导致回滚。

  b.如果上面的题目中,父方法发生异常,会不会影响子方法的提交?

  答案:不会,因为子方法是新创建的事务,不会收到父级方法的影响。

 

5、 Not_Supported 无论父方法有没有事务,子方法都特例独行,不添加事务。

 

6、 Never 也是不事务,区别在于当父调用者存在事务,此时会抛出异常。

 

7、 Nested 如果有事务运行,就作为这个事务的嵌套事务运行; 如果没有事务运行,新建一个事务运行

 

其他:

NESTED和REQUIRED_NEW的区别:

假设都是在一个REQUIRED类型的事务里调用这些事务,就像上面的例子,该REQUIRED类型方法调用抛出异常,REQUIRED_NEW的方法仍然可以提交,但是NESTED还要受到REQUIRED事务回滚而被迫回滚;这就是我认为的新的事务与内嵌事务的区别;

 

假设都是在一个REQUIRED类型的事务里调用这些事务方法,REQUIRED_NEW和NESTED都抛出异常的情况下,外层事务不写try-catch,都会导致该REQUIRED类型事务全部回滚.  REQUIRED_NEW和NESTED调用处写了try-catch块,外层可以正常提交;但是REQUIRED类型的外层即使写了Try-catch块,也会抛出异常: Transaction rolled back because it has been marked as rollback-only

posted @ 2021-08-09 11:11  奋斗的大橙子  阅读(257)  评论(0)    收藏  举报