Spring添加了注解@Transactional事务不回滚总结
2017-08-29 11:55
453 查看
一、很久之前遇到过一次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 交给框架统一定义好的异常 让框架处理,具体看自己架构
二、总结
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 交给框架统一定义好的异常 让框架处理,具体看自己架构
相关文章推荐
- Spring中声明式事务的注解@Transactional的参数的总结(REQUIRED和REQUIRES_NEW的与主方法的回滚问题)
- Spring事务注解@Transactional回滚问题
- 关于Spring的@Transactional注解失效以及事务无法回滚问题
- spring 事务 @Transactional注解参数 tx:annotation-driven
- Spring 之注解事务 @Transactional
- spring事物配置,声明式事务管理和基于@Transactional注解的使用
- spring 事务注解@Transactional
- spring事物配置,声明式事务管理和基于@Transactional注解的使用
- 记录一次Spring boot 搭建框架连接Mysql数据库注解事务不回滚的故障
- Spring中@Transactional事务回滚实例及源码
- spring事物配置,声明式事务管理和基于@Transactional注解的使用
- Spring 之注解事务 @Transactional
- Spring 之注解事务 @Transactional
- Spring 之注解事务 @Transactional
- spring事物配置,声明式事务管理和基于@Transactional注解的使用
- @Transactional注解事务不回滚不起作用无效
- @Transactional注解事务不回滚不起作用无效
- Spring MVC @Transactional注解方式事务无法回滚的解决办法
- 【spring 事务注解配置】事务回滚
- spring事物配置,声明式事务管理和基于@Transactional注解的使用