我正在处理一个在执行任务时记录到数据库的服务层。我想确保每当发生错误时此日志不会回滚,因为我应该始终记录失败的尝试。下面是示例代码,用于解释我想要的内容。
@Transactional(rollbackFor=Exception.class)
public void performTask()
{
//Perform task 1
log("task1Complete");
//Perform task 2
log("task2Complete");
}
@Transactional()
public void log(String message)
{
//commit message to DB
//This should never rollback
}
我认为这样做的方法是开始新的交易,但我不确定如何。
答案 0 :(得分:2)
你想用:
@Transactional(propagation = Propagation.REQUIRES_NEW)
请参阅:Propagation
此外,您的TransactionManager必须配置为allow nested transactions。
答案 1 :(得分:2)
使用:
@Transactional(propagation = Propagation.REQUIRES_NEW)
请注意,如果您使用的是JDK Proxies或CGIL Proxies,则在“this”上调用@Transactional方法将无法打开事务。您必须使用AspectJ,或者在另一个对象上调用它以通过其代理。