spring声明式事务失效

1.数据库存储引擎不支持事务

mysql的话innodb支持事务

2.没有被spring容器管理

申明事务的类方法必须得假如spring容器,让spring帮我们开启事务

3. 数据源没有配置事务管理器
4.在非public修饰的方法使用

@Transactional注解使用的是AOP,在使用动态代理的时候只能针对public方法进行代理

5.发生了自身调用

同一个类中,methodA 没有设置事务,methodB 设置了事务,methodA 调用 methodB 时,事务失效;
我们知道,Spring之所以可以对开启@Transactional的方法进行事务管理,是因为Spring为当前类生成了一个代理类,然后在运行相关方法时,会判断这个方法有没@Transactional注解,如果有的话,则会开启一个事务。
其实现原理是 AOP , 而 AOP 的原理是动态代理 , 在自调用的过程中 , 是类自身的调用 ,而不是代理对象去调用, 那么就不会产生 AOP , 这样 Spring就不能把你的代码织入到约定的流程中

6.异常被 catch 了

在业务代码中一般不需要 catch 异常,如果非要 catch 一定要抛出 throw new RunTimeException()
,或注解中指定异常类型@Transactional(rollbackFor=Exception.class),否则会导致事务失效。

7.配置的传播级别错误(propagation)
8.异常类型配置错误

@Transactional 的 rollbackFor 设置不正确

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值