「Spring」事务失效的场景

 我来答
世纪网络17
2022-06-29 · TA获得超过5910个赞
知道小有建树答主
回答量:2426
采纳率:100%
帮助的人:138万
展开全部

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

Spring 事务生效的前提是所连接的数据库要支持事务,如果底层的数据库引擎都不支持事务,则Spring的事务肯定会失效。

例如: MySQL 用的不是 InnoDB 引擎,而是用的 MyISAM 存储引擎。

2.事务方法未被 Spring 容器管理

如果事务方法所在的类没有加载到 Spring IOC 容器中,也就是说,事务方法所在的类没有被 Spring 容器管理,则Spring事务会失效。

例如:你的方法所在类没有加@Component或者@Service注解。

3.方法没有被 public 修饰

如果事务所在的方法没有被 public 修饰,此时 Spring 的事务也会失效。

4.同一类中方法之间直接的调用

例如:如果同一个类中有两个方法分别为 A 和 B,方法 A 没有添加事务注解,而方法 B 添加了 @Transactional 事务注解,此时方法 A 直接调用方法 B,则方法 B 的事务会失效。

5.未配置事务管理器

如果在项目中没有配置 Spring 的事务管理器,即使使用了 Spring 的事务管理功能,Spring 的事务也不会生效。

例如:对于 SpringBoot 项目来说,导入了 mybatis 的 starter 依赖后,SpringBoot 会自动注入DataSourceTransactionManager 事务管理器,这样我们就可以直接用 @Transactional 注解使用事务了。

6.事务传播类型不支持事务

如果方法的事务传播类型为不支持事务的传播类型,则该方法的事务在 Spring 中会失效。

例如: A 方法的事务传播类型为 NOT_SUPPORTED,不支持事务,此时用带事务的方法 B 去调用 A 方法,则 A 方法的事务失效。

7.进行异常捕捉却没有抛出

比如对某一个新增数据代码段进行 try catch 异常,而 catch 里没有向外抛出异常,此时 spring 事务无法回滚。

8.错误的标注异常类型

如果在 @Transactional 注解中标注的异常类型不是我们抛出的异常类型,则Spring事务的回滚会失效。

例如: Spring 中默认回滚的异常类型为 RuntimeException,如果此时你抛出的异常是 Exception,那么Spring 事务中无法捕获到 Exception 异常,则事务回滚会失效。

9.开启多线程

开启一个线程去执行数据库操作,多线程内的方法将不被 spring 事务控制。

例如:一个带事务的方法 A 中开启线程去执行同类中的一个 insert 方法,即使这个操作失败了,也不会回滚 A 中的其他数据库操作。

注意:如果把 insert 方法提出到一个新的类中,加入事务注解,就能成功的把 insert 方法加入到 spring 事务管理中。但是使用多线程事务的情况下,如果想进行回滚,比较麻烦,因为我们感知不到线程中方法执行的异常。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式