Spring事务简介
事务其实是一个并发控制单位,是用户定义的一个操作序列,这些操作要么全部完成,要不全部不完成,是一个不可分割的工作单位,具备ACID属性。Spring事务的本质是通过AOP面向切面功能,对方法进行拦截,在执行之前开启事务,在执行完方法后根据情况提交或者回滚事务。
Spring事务失效的场景
下面为大家介绍Spring事务失效的常见的四个场景,以及失效原因和解决方案。
环境准备:通过两个用户进行转账操作来演示。111和222用户初始各有1000块,现在111用户向222用户转500.
1.异常捕获处理
异常捕获处理
查看结果:111用户更新数据,222用户并未更新,事务失效。
原因:事务通知只有捉到了目标抛出的异常,才能进行后续的回滚,如果目标自己处理异常,事务通知无法捕捉到异常,不会进行回滚,事务失效。
解决方法:添加throw new RuntimeException(e)不捕获异常。
2.抛出异常检查
查看结果:111用户更新数据,222用户并未更新,事务失效。
原因:Spring事务默认只会回滚非检查异常。
解决方案:在注解上配置rollbackFor属性
3.非public方法导致的事务失效
查看结果:111用户更新数据,222用户并未更新,事务失效。
原因:Spring会为方法创建代理、AOP添加事务通知前提条件是该方法时public的。
解决方案:使用public修饰方法。
4.目标方法使用final修饰
失效原因: spring 事务底层使用了 AOP对方法进行拦截,在执行之前开启事务,也通过 jdk 动态代理帮我们生成了代理类,在代理类中实现的事务功能。但如果某个方法用 final 修饰了,那么在它的代理类中,就无法重写该方法,而添加事务功能。
总结
本篇文章记录了作者对在日常开发中遇到的事务失效的场景进行了总结和解决方案,欢迎大家交流,进行指正!!!!