看到一个词“事务的传播特性”,在网上查找半天没理解是啥,看了一个网友列举的实例才有点明白,此处用其实例整理下思路:
上图方法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:如果没有,就抛出异常;如果有,就使用当前事务。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/101351.html