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获得的数据不会回滚
# 1 楼答案
乍一看,看起来你做的一切都是对的。但是,在您搜索它不起作用的原因之前,代码中的小改动首先可以防止问题的发生:
在这种情况下,您的异常将在您保存到DB之前发生,您不会有问题
# 2 楼答案
如果您使用的是Spring
@Transactional
,我研究的结果是rollbackFor
选项,但不是rollbackOn
(我不确定这一点),比如 这个:@Transactional(rollbackFor = BaseException.class)
确保在spring配置中启用了事务性:
@EnableTransactionManagement
在您的情况下,只有
BaseException
会触发回滚,其他Exception
不会