我的问题很简单,我想在方法上回滚用@Transactional
创建的事务,并且仍然可以将某些结果返回给调用者。
@Transactional
public Object myMethod () {
...
// flag transaction for rollback
return myObject;
}
我看到这个question似乎暗示要么抛出一个异常(不是我真正想要的东西)或者调用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
,但最终这也会抛出一个异常(我正在使用JpaTransactionManager)
知道如何实现目标吗?
答案 0 :(得分:1)
在更改数据库中的数据之前,我总是对其进行验证。因为数据在持久化更改时必须有效,所以我认为抛出异常是正确的行为(对于无效数据的情况)。
另一方面,如果您不想在持久化之前显式验证数据,请抛出包含您需要的其他字段的覆盖异常。
PS:在我的逻辑中,我认为回滚一个事务有一个关键原因,除以外的数据无效。
尝试验证数据并在同一服务方法中将其保存在DB 中在我看来是糟糕的设计。想象一下,如果验证失败,您想要返回带有验证消息的容器,或者如果事务是正确的,则返回新实体。你的方法应该有什么回报类型?
答案 1 :(得分:0)
尝试
@Transactional(readOnly=true)
离开后会回滚。但要注意:
@Transactional
public void save(){
trySave();
}
@Transactional(readOnly=true)
private void trySave(){
...
}
这将忽略readOnly
,因为事务块在save()
!