Spring事务失效的原因

本文详细解析了Spring事务可能出现的失效情况,包括注解异常处理类型不全面、内部try-catch阻止回滚、AOP切面顺序问题、非公开方法以及父子容器配置错误。针对这些问题,提出了相应的解决方案,如指定异常处理为Exception.class、正确抛出异常、调整切面顺序、确保方法为public以及避免子容器扫描无事务配置的服务。了解这些原因和对策能有效防止Spring事务管理中的常见问题。
摘要由CSDN通过智能技术生成

Spring事务失效的原因

1、注解中可以指定处理异常的类型,当遇到对应异常的时候会回滚,但是没有指明的异常,不会进行回滚,而是直接提交事务
默认只对RuntimeException和ErrorException这两个类及其子类的异常进行回滚操作。

解决方法:异常处理类型指定为Exception.class,这个类是所有异常的父类,会涵盖全部的异常。

2、业务方法内自己try-catch异常导致事务不能正常回滚。
事务通知只有捕捉到了目标抛出的异常,才能进行后续的回滚处理,但是如果方法内部自己进行了异常的处理,事务通知就无法捕捉到异常,就不会回滚。

解决方法:①在try-catch语句中对捕捉到的异常原样抛出;②在捕捉到异常以后手动设置TransactionStatus.setRollbackOnly();

3、AOP切面顺序导致事务不能正常进行回滚
事务切面优先级最低,如果自定义的切面优先级设置和事务切面优先级一样,则自定义切面还是在内层,如果自定义切面没有正确的抛出异常,事务切面仍然无法处理。

解决方法:①在try-catch语句中对捕捉到的异常原样抛出;②在捕捉到异常以后手动设置TransactionStatus.setRollbackOnly();

4、非public方法导致事务失效
Spring为方法创建代理、添加事务通知,这些的前提都是方法是pubic的

解决方法:改成public方法

5、父子容器导致的事务失效
子容器扫描范围过大,把没加事务配置的service扫描进来
解决方法:每个容器各司其职,不要扫描到其他容器负责的部分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值