1

我对 Spring 和事务还很陌生。我确信这个问题之前已经被问过,但我仍然无法找到正确的方法来解决这个问题。

我正在使用 Spring 和休眠。我有一个这样的服务方法:

@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),但仍然遇到同样的问题。有什么建议吗?会不会是配置问题?

4

1 回答 1

-1

如果发生数据库异常(例如违反约束),reportDAO.save()或者reportDAO.markReportAsFailed()无论您在应用程序级别做什么,事务都将在数据库级别回滚。

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

HTH。

于 2012-07-17T06:48:53.157 回答