【问题标题】:Spring Boot + JPA : @Transactional annotation : Roll back is not workingSpring Boot + JPA:@Transactional 注释:回滚不起作用
【发布时间】:2019-06-15 00:34:31
【问题描述】:

我将 @Transactional 与 spring boot 和 jpa 一起使用。但它不起作用。有人可以帮忙吗?

我的插入在 myDAO 中,它在服务类中自动装配。下面的代码是实现服务接口的服务类的方法

class MyService implements Service {

@Transactional(rollbackFor = RuntimeException.class)
    public ResponseVO createOrder(params) {
    myDAO.insertInTable1(param);
    myDAO.insertInTable2(param);//I kept wrong table name in this query such that it throws exception
         }

 }

【问题讨论】:

  • 这里没有错,提供更多信息:)
  • 你的回滚只针对RuntimeException,错误的表不会创建RuntimeException。阅读@Transactional 手册。
  • @Zorglube,我尝试使用 new 创建新的运行时异常。即使没有回滚。
  • 看来你不明白你在做什么,你不需要自己伪造一个异常,你需要选择你回滚或不回滚什么样的异常。
  • 从哪里调用 createOrder 方法?

标签: java spring spring-boot jpa


【解决方案1】:

从给出的代码量很难判断。我知道你不应该需要rollbackFor,如果它是RuntimeException。那些总是回滚。我猜你的表名错误是一个SQLException,它实现了Exception。你必须让rollbackFor 成为rollbackFor=SQLException.class,我只会在验证回滚发生时保留它。只有在服务调用的方法中抛出检查异常时才添加 rollbackFor。

【讨论】:

  • 我也试过了。但是没有用。但通常运行时异常会处理所有类型的异常。所以它也应该捕获这个异常并回滚。
  • SQLException 是 Exception 的子类,而不是 RuntimeException。 RuntimeException 是 Exception 的子类。只有 RuntimeException 的子类会被回滚。
【解决方案2】:

试试这个:

@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = RuntimeException.class)

希望对你有帮助。

干杯!!

【讨论】:

  • 我也会在 rollbackFor 部分尝试 Exception.class,丢弃它与抛出的异常类型无关?
  • 问题很简单,兄弟。他没有throws 子句;)public ResponseVO createOrder(params) {}
【解决方案3】:

在 Spring Boot 中,默认启用 OpenSessionInView,因此您的回滚不起作用,因为每次调用 myDAO.insertInTableX() 时,都会执行一次 Commit。

因此,要消除此行为并让您的 @Transactional 正常工作,请添加以下内容:

spring.jpa.open-in-view=false

到您的application.properties

更多信息请见this question

【讨论】:

    【解决方案4】:

    RuntimeException 已处理

    替换为@Transactional(rollbackFor = Exception.class) 以管理所有已检查的异常并且可以正常工作

    【讨论】:

      【解决方案5】:

      问题在于 MySQL 数据库引擎。我的引擎是不支持事务的 MYIsam。我将我的数据库引擎更改为 InnoDB 及其工作。感谢您的贡献。以下是相同的查询。

      选择引擎 FROM information_schema.TABLES 在哪里 表名 = '表名' AND TABLE_SCHEMA='db_name';

      ALTER TABLE table_name ENGINE = INNODB;

      【讨论】:

      猜你喜欢
      • 2020-06-04
      • 1970-01-01
      • 1970-01-01
      • 2020-12-11
      • 2019-12-07
      • 2018-11-08
      • 2018-10-09
      • 1970-01-01
      相关资源
      最近更新 更多