我对Spring和交易很新。我确信之前已经问过这个问题,但我仍然无法找到正确的解决方法。
我正在使用Spring和hibernate。我有一个这样的服务方法:
@Transactional
public void processPendingReport(Report report) {
try {
// Do processing stuff, update report object state
reportDAO.save(report);
} catch (Exception e) {
reportDAO.markReportAsFailed(report);
}
}
如果在处理期间发生RuntimeException,将抛出“标记为rollbackOnly的事务”RollbackException,结果是报告不会被标记为失败(尽管我希望它是)。
我尝试过使用@Transactional(noRollbackFor = Exception.class),但仍然遇到同样的问题..有什么建议吗?这可能是配置问题吗?
答案 0 :(得分:-1)
如果在reportDAO.save()
或reportDAO.markReportAsFailed()
中发生数据库异常(例如约束违规),则无论您在应用程序级别执行什么操作,事务都将在数据库级别回滚。
如果reportDao.save()
在为reportDAO.markReportAsFailed()
创建新交易时失败,您仍然可以将报告标记为失败。由于ReportDAO
已注释@Transactional
,因此只需从服务方法中删除@Transactional
注释即可。您还可以更改reportDAO.save()
实现以使用包装insert语句的数据库函数或存储过程,并捕获数据库级别的任何异常。
HTH。