Spring Boot 中事务不自动回滚的情况有多种,以下是一些常见的场景及解决方案:
-
非 public 方法不回滚问题:
- 问题原因: 非 public 方法上添加的
@Transactional关键字是无效的。 - 解决方案: 将方法的权限修饰符改为
public。
- 问题原因: 非 public 方法上添加的
-
try/catch 事务不回滚问题:
-
问题原因:
@Transactional在实现时需要感知到异常才会自动回滚,但在try/catch代码块中,异常被捕获后,@Transactional无法感知到异常。 -
解决方案:
- 将异常重新抛出(
throw)。 - 使用代码手动回滚事务。
- 将异常重新抛出(
-
-
调用内部
@Transactional方法问题:- 问题原因: 调用类内部的方法时,绕过了代理对象,事务失效。
- 解决方案: 给调用的方法上也加上
@Transactional。
-
抛出检查异常时事务不回滚问题:
- 问题原因:
@Transactional默认只回滚运行时异常RuntimeException和Error,对于检查异常默认是不回滚的。 - 解决方案: 在
@Transactional注解上添加rollbackFor参数并设置Exception.class值。
- 问题原因:
-
数据库不支持事务问题:
- 问题原因: 数据库引擎不支持事务,如 MySQL 中使用 MyISAM 引擎。
- 解决方案: 设置数据库引擎为支持事务的引擎,如 InnoDB。可以在新建表时设置引擎,或在修改表时设置引擎。