【问题标题】:@Transactional annotation doesn't work for method@Transactional 注释不适用于方法
【发布时间】:2019-11-18 18:14:51
【问题描述】:

我正在使用 oracleDB 和 elasticsearch 进行持久化,如果该方法出现任何问题,它会引发自定义异常。现在,如果弹性也出现任何问题,我需要从 DB 回滚。

我已经在服务类上添加了@transactional 注释。以及我在网络上找到的所有内容。

@Transactional(rollbackOn = BaseException.class)
public void transaction(ab ab, a a) {
    persistenceService.save(a);
    persistenceService.updateSignalCountDb(a.abc(), a.bcd(), ab);
    elasticService.saveSignal(a);

    try {
        elasticService.updateSignalCountElastic(a);
    } catch (Exception e) {
        throw new BaseException(ErrorCodes.FAILED_ELASTIC_SEARCH_UPDATE, e);
    }
}

persistenceService.save() 方法保存在数据库中。 persistenceService.updateSignalCountDb() 方法更新数据库中的另一个表。 elasticService.saveSignal() 方法保存在弹性中。在失败的情况下抛出基本异常。 elasticService.updateSignalCountElastic() 方法更新弹性中的另一个索引。它还调用 elasticService.delete() 方法来删​​除保存在 elastic 中的任何内容,以防失败并引发基本异常。

我预计如果整个方法出现任何故障,这将起作用。但是,如果弹性上出现任何故障,我会得到一个基本异常,但我来自 oracle db 的数据不会回滚。

【问题讨论】:

标签: java database spring-boot


【解决方案1】:

乍一看,您似乎做的一切都是正确的。但是在你寻找它不起作用的原因之前,你的代码中的小改动会首先防止问题发生:

  @Transactional(rollbackOn = BaseException.class)
  public void transaction(ab ab, a a){
    try {
      elasticService.saveSignal(a);
      elasticService.updateSignalCountElastic(a);
      persistenceService.save(a);
      persistenceService.updateSignalCountDb(a.abc(), a.bcd(), ab);
    }catch (Exception e){
      throw new BaseException(ErrorCodes.FAILED_ELASTIC_SEARCH_UPDATE, e);
    }
  }

在这种情况下,您的异常将在您保存到数据库之前发生,您不会遇到问题

【讨论】:

  • 在这种情况下,如果 db 出现任何问题,elastic 将无法回滚。
【解决方案2】:
  1. 如果您使用的是 Spring @Transactional,我研究过只有 rollbackFor 选项,但不是 rollbackOn(我不确定),比如 这个:@Transactional(rollbackFor = BaseException.class)

  2. 确保在 spring 配置中启用 Transactional:@EnableTransactionManagement

  3. 在您的情况下,只有BaseException 会触发回滚,其他Exception 不会。

【讨论】:

  • rollbackon 用于我使用 javax 的 @Transactional 的情况。无论如何,我已经开始在 spring 配置中使用 spring @Transactional@EnableTransactionManagement 并且我仍然得到相同的结果。
  • 你可以试试@Transactional(rollbackFor = Exception.class)看看是否可以触发回滚?
  • 我试过了,还是不行。但是,我能够识别出问题并解决了。
  • 出现了一个愚蠢的错误。这个方法进入了一个没有被spring处理的类。我刚刚更改了它的类并将它的 bean 放入旧类,它开始工作了。
猜你喜欢
  • 2018-02-23
  • 2011-03-10
  • 1970-01-01
  • 2014-11-21
  • 2020-03-29
  • 1970-01-01
  • 2011-09-07
  • 2012-08-25
  • 1970-01-01
相关资源
最近更新 更多