事务传播的几种情况
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