事务不回滚

一.问题

      今天在项目中遇到一个奇怪的问题,大家都知道Spring有事务回滚的机制,可是自己的事务却没有回滚,导致程序异常之后还是对数据库进行了操作,产生了一系列的脏数据,这是一件非常可怕的事。尤其一个方法里对多个表进行操作并且会产生很多数据,一旦不回滚后果可想而知。

二.起因

 1.首先事务回滚自己在方法上面加了注解

2.下面有图有一个信息订阅的方法 :首先保存订阅信息  然后调用回调方法  

结果发生异常了,按道理来说事务会回滚,可是奇怪的是订阅信息被保存了,多尝试了几次都是这样很奇怪。后来查了下事务回滚原理,才发现问题。原来默认spring事务只在发生未被捕获的 runtimeexcetpion时才回滚,而自己把异常捕捉了既没有处理也没有往外Throw所以Spring根本不知道发生异常,自然不会帮你回滚。

3.后来经try{}catch{}去除之后,如下图

再去尝试了一下,果然和自己想的一样,事务进行了回滚。

三.总结

   1.有些事情知道是知道,但是在用起来还是会踩坑,不要去想当然。

   2.异常不要随意去捕捉,如果没有特殊需要的时候,或者自己没有一些自定义异常的时候,往往好心办坏事。

   3.写东西要上心,不是实现功能就可以,一定要考虑后果,不然没问题还好,一旦出问题,就会很严重,虽然是小事,还是想     写出来和大家共勉,不要踩同样的坑。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值