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,直接手动抛出更新失败的自定义异常,触发事务回滚。


三、一切没有代码的总结都是耍流氓,我贴一段示例:

下图为手动抛出异常;

Spring添加了注解@Transactional事务不回滚总结





下图为最外层统一try catch处理异常,当然也可以不try catch 交给框架统一定义好的异常 让框架处理,具体看自己架构

Spring添加了注解@Transactional事务不回滚总结