Spring之路(41)–注意规避@Transactional声明式事务失效的情况
2020/2/17 8:17:19
本文主要是介绍Spring之路(41)–注意规避@Transactional声明式事务失效的情况,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
注意!
Spring中使用@Transactional
的声明式事务是足够简单了,对底层逻辑进行了封装,开发人员拿来即用,方便快捷。
但是一定要注意在某些情况下,声明式事务会失效,事务是如此重要,一旦失效可能会带来灾难性后果,所以本篇我们来实验下。
抛出检查型异常时事务失效
首先了解下一场类型:
- Exception,受检查的异常,在程序中必须使用try…catch进行处理,遇到这种异常必须进行catch或throw,如果不处理,编译器会报错。例如IOException。
- RuntimeException:非受检查的异常,可以不使用try…catch进行处理。例如常见的NullPointerException。
在我们的观念中,只要有异常,事务就应该回滚,实际上使用@Transactional时,默认只对非受检查异常回滚。例如:
@Transactional public void addTwoBlog() throws Exception{ BlogDo blog = new BlogDo(); blog.setContent("测试"); blogDao.insert(blog); blogDao.insert(blog); throw new RuntimeException();//非检查异常,回滚 }
@Transactional public void addTwoBlog() throws Exception{ BlogDo blog = new BlogDo(); blog.setContent("测试"); blogDao.insert(blog); blogDao.insert(blog); int a=1/0;//非受检查异常,回滚 }
@Transactional public void addTwoBlog() throws Exception{ BlogDo blog = new BlogDo(); blog.setContent("测试"); blogDao.insert(blog); blogDao.insert(blog); throw new Exception();//注意!此处为受检查的异常,报错但不会回滚 }
OK,那么按正常情况下,我们认为一旦有异常,都应该回滚,此时只需要为注解添加rollbackFor=Exception.class
属性即可。
例如:
@Transactional(rollbackFor=Exception.class)//只要抛出异常就会回滚 public void addTwoBlog() throws Exception{ BlogDo blog = new BlogDo(); blog.setContent("测试"); blogDao.insert(blog); blogDao.insert(blog); throw new Exception(); }
一个事务方法调用另一个事务方法时失效
看如下案例:
@Transactional public void startTransaction() throws Exception{ this.addTwoBlog(); } @Transactional(rollbackFor=Exception.class) public void addTwoBlog() throws Exception{ BlogDo blog = new BlogDo(); blog.setContent("测试"); blogDao.insert(blog); blogDao.insert(blog); throw new Exception(); }
startTransaction和addTwoBlog方法都是事务方法,且这两个方法事务特性不同(一个没有rollbackFor=Exception.class),如果我们调用startTransaction方法,则addTwoBlog中的事务并不会生效。
也就是说,如果在同一个bean中,一个事务方法调用另一个事务方法,可能会导致被调用的事务方法的事务失效!
这是因为Spring的声明式事务使用了代理,具体机制此处不再探讨,但是一定要规避这种事务失效的场景。我们可以通过将对数据库的操作放到一个bean方法里来解决这个问题。
这篇关于Spring之路(41)–注意规避@Transactional声明式事务失效的情况的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?
- 2024-05-09企业src漏洞挖掘-有意思的命令执行