嵌套的Spring Transaction永远不会回滚

时间:2011-11-04 14:22:15

标签: java spring transactions

我正在处理一个在执行任务时记录到数据库的服务层。我想确保每当发生错误时此日志不会回滚,因为我应该始终记录失败的尝试。下面是示例代码,用于解释我想要的内容。

@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
}

我认为这样做的方法是开始新的交易,但我不确定如何。

2 个答案:

答案 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,或者在另一个对象上调用它以通过其代理。