看到一个词“事务的传播特性”,在网上查找半天没理解是啥,看了一个网友列举的实例才有点明白,此处用其实例整理下思路:
上图方法1对应的事务叫事务1,方法2对应的事务叫事务2;其中事务1调用了事务2;
期望:想要让事务2发生异常时回滚,而事务1不回滚(catch后继续循环下一个);
实际:事务2回滚时事务1也回滚了,不符合期许;
原因:当调用方法1时会创建事务1,当调用方法2时准备创建事务2了,发现已经有事务1存在了,那就节省资源不创建事务2,直接用事务1了,导致方法1方法2用的同一个事务;
解决:更改事务2的隔离级别为----PROPAGATION_NESTED;
详细参考:https://blog.csdn.net/u010634066/article/details/78334259
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Spring它对JDBC的隔离级别作出了补充和扩展,其提供了7种事务传播行为。
1、PROPAGATION_REQUIRED:默认事务类型,如果没有,就新建一个事务;如果有,就加入当前事务。适合绝大多数情况。
2、PROPAGATION_REQUIRES_NEW:如果没有,就新建一个事务;如果有,就将当前事务挂起。
3、PROPAGATION_NESTED:如果没有,就新建一个事务;如果有,就在当前事务中嵌套其他事务。
4、PROPAGATION_SUPPORTS:如果没有,就以非事务方式执行;如果有,就使用当前事务。
5、PROPAGATION_NOT_SUPPORTED:如果没有,就以非事务方式执行;如果有,就将当前事务挂起。即无论如何不支持事务。
6、PROPAGATION_NEVER:如果没有,就以非事务方式执行;如果有,就抛出异常。
7、PROPAGATION_MANDATORY:如果没有,就抛出异常;如果有,就使用当前事务。