一.问题
今天在项目中遇到一个奇怪的问题,大家都知道Spring有事务回滚的机制,可是自己的事务却没有回滚,导致程序异常之后还是对数据库进行了操作,产生了一系列的脏数据,这是一件非常可怕的事。尤其一个方法里对多个表进行操作并且会产生很多数据,一旦不回滚后果可想而知。
二.起因
1.首先事务回滚自己在方法上面加了注解
2.下面有图有一个信息订阅的方法 :首先保存订阅信息 然后调用回调方法
结果发生异常了,按道理来说事务会回滚,可是奇怪的是订阅信息被保存了,多尝试了几次都是这样很奇怪。后来查了下事务回滚原理,才发现问题。原来默认spring事务只在发生未被捕获的 runtimeexcetpion时才回滚,而自己把异常捕捉了既没有处理也没有往外Throw所以Spring根本不知道发生异常,自然不会帮你回滚。
3.后来经try{}catch{}去除之后,如下图
再去尝试了一下,果然和自己想的一样,事务进行了回滚。
三.总结
1.有些事情知道是知道,但是在用起来还是会踩坑,不要去想当然。
2.异常不要随意去捕捉,如果没有特殊需要的时候,或者自己没有一些自定义异常的时候,往往好心办坏事。
3.写东西要上心,不是实现功能就可以,一定要考虑后果,不然没问题还好,一旦出问题,就会很严重,虽然是小事,还是想 写出来和大家共勉,不要踩同样的坑。