Spring Boot 中事务不自动回滚的常见的场景及解决方案

256 阅读1分钟

Spring Boot 中事务不自动回滚的情况有多种,以下是一些常见的场景及解决方案:

  1. 非 public 方法不回滚问题

    • 问题原因: 非 public 方法上添加的 @Transactional 关键字是无效的。
    • 解决方案: 将方法的权限修饰符改为 public
  2. try/catch 事务不回滚问题

    • 问题原因: @Transactional 在实现时需要感知到异常才会自动回滚,但在 try/catch 代码块中,异常被捕获后,@Transactional 无法感知到异常。

    • 解决方案:

      • 将异常重新抛出(throw)。
      • 使用代码手动回滚事务。
  3. 调用内部 @Transactional 方法问题

    • 问题原因: 调用类内部的方法时,绕过了代理对象,事务失效。
    • 解决方案: 给调用的方法上也加上 @Transactional
  4. 抛出检查异常时事务不回滚问题

    • 问题原因: @Transactional 默认只回滚运行时异常 RuntimeExceptionError,对于检查异常默认是不回滚的。
    • 解决方案:@Transactional 注解上添加 rollbackFor 参数并设置 Exception.class 值。
  5. 数据库不支持事务问题

    • 问题原因: 数据库引擎不支持事务,如 MySQL 中使用 MyISAM 引擎。
    • 解决方案: 设置数据库引擎为支持事务的引擎,如 InnoDB。可以在新建表时设置引擎,或在修改表时设置引擎。