Spring事务失效场景及原因

本文详细介绍了Spring事务的原理,探讨了四种常见事务失效场景,包括异常处理、非检查异常、非public方法和final修饰方法,提供了解决方案以确保事务的正确执行。
摘要由CSDN通过智能技术生成

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 修饰了,那么在它的代理类中,就无法重写该方法,而添加事务功能。

总结

本篇文章记录了作者对在日常开发中遇到的事务失效的场景进行了总结和解决方案,欢迎大家交流,进行指正!!!!

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值