根据实际测试,对原博主的内容做了修订。y
关于PROPAGATION_NESTED的理解_yanxin1213的博客-CSDN博客
定义serviceA.methodA()以PROPAGATION_REQUIRED修饰;
定义serviceB.methodB()以表格中三种方式修饰;
methodA中调用methodB:
异常状态 | PROPAGATION_REQUIRES_NEW (两个独立事务) | PROPAGATION_NESTED (B的事务嵌套在A的事务中) | PROPAGATION_REQUIRED (同一个事务) |
---|---|---|---|
methodA抛异常 methodB正常 | A回滚,B正常提交 | A与B一起回滚 | A与B一起回滚 |
methodA正常 methodB抛异常 | 1.如果A中捕获B的异常,并没有继续向上抛异常,则B先回滚,A再正常提交; 2.如果A未捕获B的异常,默认则会将B的异常向上抛,则B先回滚,A再回滚 | 1.如果A中捕获B的异常,并没有继续向上抛异常,则B先回滚,A再正常提交; 2.如果A未捕获B的异常,默认则会将B的异常向上抛,则B先回滚,A再回滚 | A与B一起回滚 无论A是否捕获异常,都会回滚。 B抛异常时,事务已经被标记为“rollback-only”。A如果catch了异常在执行结束事务提交仍会报错。 |
methodA抛异常 methodB抛异常 | B先回滚,A再回滚 | A与B一起回滚 | A与B一起回滚 |
methodA正常 methodB正常 | B先提交,A再提交 | A与B一起提交 | A与B一起提交 |
对于两个都是默认事务的方法嵌套,外层仅通过catch无法屏蔽内层异常对事务提交的影响,需要将内层事务修改为PROPAGATION_REQUIRES_NEW 或者 PROPAGATION_NESTED