Spring 事务Transactional 不生效场景
2022-09-29 14:29:34 9 举报
AI智能生成
Spring 事务Transactional 不生效场景
作者其他创作
大纲/内容
非 public 方法中事务不回滚的直接原因是,在非 public 方法上添加的 @Transactional 关键字是无效的,也就是此方法本身是以非事务的方式运行的,所以它当然不会自动回滚事务了。
因为 @Transactional 使用的是 Spring AOP 实现的,而 Spring AOP 是通过动态代理实现的,而 @Transactional 在生成代理时会判断,如果方法为非 public 修饰的方法,则不生成代理对象,这样也就没办法自动回滚事务了
非 public 修饰的方法中的事务不自动回滚
当程序中出现了 try/catch 代码时,事务不会自动回滚,这是因为 @Transactional 注解在其实现时,需要感知到异常才会自动回滚,而用户自行在代码中加入了 try/catch 之后,@Transactional 就无法感知到异常了,那么也就不能自动回滚事务了。
一种是在 catch 中将异常重新抛出去,另一种是使用代码手动将事务回滚。
当 @Transactional 遇上 try/catch 事务不自动回滚
调用类内部 @Transactional 的方法不自动回滚事务的原因是,@Transactional 是基于 Spring AOP 实现的,而 Spring AOP 又是基于动态代理实现的,而当调用类内部的方法时,不是通过代理对象完成的,而是通过 this 对象实现的,这样就绕过了代理对象,从而事务就失效了。
解决方案是给调用的方法上也加上 @Transactional
调用类内部的 @Transactional 方法事务不自动回滚
@Transactional 默认只回滚运行时异常 RuntimeException 和 Error,而对于检查异常默认是不回滚的。
解决方案是给 @Transactional 注解上,添加 rollbackFor 参数并设置 Exception.class 值即可
抛出检查异常时事务不自动回滚
MyISAM 引擎,它本身是不支持事务的
数据库不支持事务,事务也不会自动回滚
事务不生效场景
0 条评论
回复 删除
下一页