Spring事务失效的几种场景包括:

本文探讨了Spring事务管理中遇到的问题,包括非支持事务的数据库引擎、未被Spring管理的类、方法访问权限、自调用方法的事务处理、传播行为设置不当、异常处理和未配置事务管理器等,并提供了相应的解决方案。
摘要由CSDN通过智能技术生成

  1. 数据库引擎不支持事务:如果使用的数据库存储引擎不支持事务,如MyISAM,那么无论Spring事务管理如何配置,事务都不会生效。从MySQL 5.5.5开始,默认的存储引擎变为了InnoDB,它支持事务。
  2. 类没有被Spring管理:如果类上缺少如@Component、@Controller、@Service、@Mapper或@Repository等注解,该类不会被Spring加载为Bean,因此不会被Spring事务管理。
  3. @Transactional注解用在了非public修饰的方法上:Spring要求被代理的方法必须是public的。如果方法不是public,例如private、protected或默认(包内私有)访问级别,TransactionAttribute可能会返回null,导致事务失效。

  4. 同一个类中方法互相调用(自调用):如果一个类中的方法A调用方法B(B上有@Transactional注解),无论A是否有事务注解,事务都会失效。这是因为只有当事务方法被当前类以外的代码调用时,Spring才会生成代理对象。(个人测试b上有事务,a没有则失效,其他都成功回滚了)
  5. 传播行为配置成了不支持事务:例如,Propagation.NOT_SUPPORTED表示不以事务运行,如果当前已存在事务,则会挂起。

  6. 异常被try-catch“吃掉了”:如果Service中的方法抛出异常,但在Controller中被try-catch捕获,Controller会认为操作正常提交,不需要回滚,导致事务失效。

  7. 数据源没有配置事务管理器:如果没有为数据源配置事务管理器,事务将无法正常工作。

  8. 异常类型不匹配:如果异常类型与@Transactional注解中指定的不回滚异常类型不匹配,事务可能不会触发回滚。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值