我正在使用oracleDB和elasticsearch进行持久化,如果该方法出现任何问题,它将引发一个自定义异常。现在,如果任何事情也无法通过弹性恢复,那么我需要从数据库回滚。
我已经在服务类上添加了@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()方法保存在db中。 persistenceService.updateSignalCountDb()方法更新db中的另一个表。 elasticService.saveSignal()方法可节省弹性。失败时抛出基本异常。 elasticService.updateSignalCountElastic()方法更新elastic中的另一个索引。它还会调用elasticService.delete()方法以删除发生故障时保存在elastic中的所有内容,并引发基本异常。
我希望这在整个方法失败的情况下仍然有效。但是,如果任何事情在弹性上失败了,我都会得到一个基本异常,但是我从oracle db获得的数据不会回滚。
答案 0 :(得分:0)
乍一看,看来您做对了所有事情。但是,在搜索不起作用的原因之前,对代码进行小的更改将首先防止出现此问题:
@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中之前发生,并且不会出现问题
答案 1 :(得分:0)
如果您使用的是Spring ['Pedrito De Rosa', 'NIE X1111222233', 'tf 2283396922', 'efael@hostmailer.com']
['Paseo Jauregizahar 234 - 1. A. Donostia ']
['paisaje y ciudad ']
['2014-12-10 Avance Normas Subsidiarias', 'Otras consultas']
,我研究过
@Transactional
选项,但没有rollbackFor
(我不确定),例如
这个:rollbackOn
。
确保在春季配置中启用了事务处理:@Transactional(rollbackFor = BaseException.class)
在您的情况下,只有@EnableTransactionManagement
会触发回滚,其他BaseException
不会触发。