@Transactional 事务失效场景大全

1.确保已开启TransactionManagment

  1. 如果你的项目引入了boot-starter的jar包,则不需要自己配置DataSourceTransactionManager,springboot自动配置特性会帮你配置。
  2. 如果未正确配置,则需在Application启动类上,使用注解@EnableTransactionManagement让springboot帮你配置。
  3. 不建议重写config类,自己实现改配置

2.确保@Transactional注解的方法的修饰符

  1. @Transaction作用于类上,则该类下的所有public方法生效
  2. @Transaction作用于方法上,只有public修饰的方法生效,其余不生效

3.确保调用的是AOP代理的方法

@Transaction注解基于aop代理生效,所以只有在使用代理类的带有注解的方法才会生效。比如,方法内调用同类含有@Transaction注解的其他方法,则执行的是本类方法,而不是代理类的方法,所以不会生效。

4.确保@Transaction的回滚异常

  1. 手动try/catch异常后,不再自动进行事务回滚.
    1. 可在.catch语句中最后增加throw new RuntimeException()语句,以便让aop捕获异常再去回滚.
    2. 在catch语句中设置手动回滚TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  2. 抛出的异常为不回滚异常,注解默认回滚RuntimeException和Error,其他查询异常不会回滚,可以使用@Transaction的rollbackFor和noRollbackFor属性设置回滚/不回滚异常类型

5.@Transactional 注解属性 propagation 设置错误

propagation 为事务的传播行为,如果设置了不恰当的传播行为可能导致操作已非事务的方式执行,也就不可能进行回滚. 例如:将 propagation 设置为 PROPAGATION_NOT_SUPPORTED 指定的方法不能在事务环境中执行,若当前存在事务,就将当前事务挂起。

6.数据库表引擎不支持事务

例如MySQL的MyISAM引擎.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值