Spring嵌套事务​​标记为rollbackonly,带有未经检查的异常

时间:2012-07-16 23:38:59

标签: spring hibernate transactions

我对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),但仍然遇到同样的问题..有什么建议吗?这可能是配置问题吗?

1 个答案:

答案 0 :(得分:-1)

如果在reportDAO.save()reportDAO.markReportAsFailed()中发生数据库异常(例如约束违规),则无论您在应用程序级别执行什么操作,事务都将在数据库级别回滚。

如果reportDao.save()在为reportDAO.markReportAsFailed()创建新交易时失败,您仍然可以将报告标记为失败。由于ReportDAO已注释@Transactional,因此只需从服务方法中删除@Transactional注释即可。您还可以更改reportDAO.save()实现以使用包装insert语句的数据库函数或存储过程,并捕获数据库级别的任何异常。

HTH。