我有函数,并且该函数将在 catch 条件下继续。 我的期望是,每当它遇到条件时,它都应该回滚以前的保存数据。但为什么数据仍然保存在数据库上而不进行回滚。即使我已经使用注释@Transactional
@Transactional
public RpaLog createRpaLogObject(CreateRpaLogObjectRequest request) {
RpaLog rpaLog = new RpaLog();
try {
rpaLog.setFunctionName(request.getFunctionName());
rpaLog.setStatus(request.getStatus());
rpaLog.setCreatedDate(HelperUtils.getCurrentTimestamp());
rpaLog = rpaLogRepository.save(rpaLog);
String externalApiUrl = rpaConfig.getEndpoint() + rpaLog.getId();
restTemplate.getForObject(
externalApiUrl,
ExternalApiResponse.class
);
}catch (Exception e){
throw new CreationFailedException(MessageConstants.RPA_CREATION_FAILED + request.getFunctionName());
}
return rpaLog;
}
顺便说一下,我使用了 Spring Data Commons - CrudRepository 包。 我怎样才能实现回滚?
尝试修改您的代码,如下所示:
@Transactional(rollbackFor = Exception.class)
public RpaLog createRpaLogObject(CreateRpaLogObjectRequest request) {
RpaLog rpaLog = new RpaLog();
try {
rpaLog.setFunctionName(request.getFunctionName());
rpaLog.setStatus(request.getStatus());
rpaLog.setCreatedDate(HelperUtils.getCurrentTimestamp());
rpaLog = rpaLogRepository.save(rpaLog);
String externalApiUrl = rpaConfig.getEndpoint() + rpaLog.getId();
restTemplate.getForObject(
externalApiUrl,
ExternalApiResponse.class
);
} catch (Exception e) {
throw new CreationFailedException(MessageConstants.RPA_CREATION_FAILED + request.getFunctionName());
}
return rpaLog;
}
要测试回滚是否有效,请在 try 块中模拟异常(例如,通过抛出 RuntimeException)并检查数据库中的数据是否回滚。