Spring添加了注解@Transactional事务不回滚总结
一、很久之前遇到过一次Spring添加了注解@Transactional可测试的时候没有回滚;忽然想起来。就总结一下,作为一个记录。能帮到别人更好;
二、总结
1.首先你要确保你的配置文件正确,当然这个可能性很低,因为架构师都帮你弄好了;
2.如果你的配置文件都正确,那么很有可能你执行数据库更新、插入的时候加了 try catch 了,所以不回滚。原因如下:
@Transactional标签(Spring事务)需要异常去触发他才能回滚,设置类型默认就好,也可以手动设置触发异常的类型(这个不做讲解,不是本文重点);
如果你加了 try catch语句,就相当于把异常吞了,这样当然没法触发事务,让事务回滚;
3.解决方案:
a.去除掉try catch ,但是如果框架没统一处理异常这样会有风险;但是你可以把try catch 转移到最外层比如 controller层;
b.可以保留try catch ,但是catch里边打印错误日志之后,要手动 throw new Except(或者你自定义的异类型);如果打算这么做,建议就直接抛自定义的异常,还简单明了易于排查;
c.个人建议,try catch 转移到最外层比如controller,然后每次 更新或者插入操作时,对影响行数进行判断,如果小于1,直接手动抛出更新失败的自定义异常,触发事务回滚。
三、一切没有代码的总结都是耍流氓,我贴一段示例:
下图为手动抛出异常;
下图为最外层统一try catch处理异常,当然也可以不try catch 交给框架统一定义好的异常 让框架处理,具体看自己架构