【发布时间】:2012-07-15 21:08:21
【问题描述】:
我对 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),但仍然遇到同样的问题。有什么建议吗?会不会是配置问题?
【问题讨论】:
-
reportDAO 类是否也标记为@Transactional?
-
什么是用于reportDAO.save 和reportDAO.markReportAsFailed 的事务传播?
-
reportDAO 在类级别被标记为@Transactional。 applicationContext.xml中没有explixit tx:advice声明,所以应该是默认的,REQUIRED传播级别
-
你提到的这个rollbackException,是javax.persistence.RollbackException吗?如果是这样,它应该只出现在事务结束时,即提交时。您可以在保存方法之前检查事务状态以检查它是否尚未标记为回滚吗?还是“markReportAsFailed”方法是抛出rollbackException的方法?
-
我认为您应该尝试使用 REQUIRES_NEW 的 reportDAO.markReportAsFailed 事务,因为您希望父事务作为回滚但markReportAsFailed 被提交
标签: spring hibernate transactions