以编程方式在spring中回滚事务

时间:2015-06-02 13:36:31

标签: java spring jpa transactions

我的问题很简单,我想在方法上回滚用@Transactional创建的事务,并且仍然可以将某些结果返回给调用者。

@Transactional
public Object myMethod () {
    ...
    // flag transaction for rollback
    return myObject;
}

我看到这个question似乎暗示要么抛出一个异常(不是我真正想要的东西)或者调用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();,但最终这也会抛出一个异常(我正在使用JpaTransactionManager)

知道如何实现目标吗?

2 个答案:

答案 0 :(得分:1)

在更改数据库中的数据之前,我总是对其进行验证。因为数据在持久化更改时必须有效,所以我认为抛出异常是正确的行为(对于无效数据的情况)。

另一方面,如果您不想在持久化之前显式验证数据,请抛出包含您需要的其他字段的覆盖异常。

PS:在我的逻辑中,我认为回滚一个事务有一个关键原因,以外的数据无效。

尝试验证数据并在同一服务方法中将其保存在DB 在我看来是糟糕的设计。想象一下,如果验证失败,您想要返回带有验证消息的容器,或者如果事务是正确的,则返回新实体。你的方法应该有什么回报类型?

答案 1 :(得分:0)

尝试

@Transactional(readOnly=true)

离开后会回滚。但要注意:

@Transactional
public void save(){
   trySave();
}
@Transactional(readOnly=true)
private void trySave(){
   ...
}

这将忽略readOnly,因为事务块在save()

中开始