有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java@Transactional注释不适用于方法

我正在使用oracleDB和elasticsearch进行持久化,如果该方法出现任何错误,它会抛出一个自定义异常。现在我需要从DB回滚,如果有任何东西在elastic中失败

我已经在服务类上添加了@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);
    }
}

坚持服务。save()方法保存在数据库中。 坚持服务。updateSignalCountDb()方法更新数据库中的另一个表。 弹性服务。saveSignal()方法以弹性方式保存。在失败的情况下引发基本异常。 弹性服务。updateSignalCounterastic()方法更新elastic中的另一个索引。它也叫elasticService。delete()方法删除elastic中保存的任何内容,以防出现故障并引发基本异常

我希望在整个方法出现任何故障的情况下,这会起作用。但如果elastic出现任何故障,我会得到一个基本异常,但我从oracle db获得的数据不会回滚


共 (2) 个答案

  1. # 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之前发生,您不会有问题

  2. # 2 楼答案

    1. 如果您使用的是Spring @Transactional,我研究的结果是 rollbackFor选项,但不是rollbackOn(我不确定这一点),比如 这个:@Transactional(rollbackFor = BaseException.class)

    2. 确保在spring配置中启用了事务性:@EnableTransactionManagement

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