如何在新的但嵌套的事务中从会话中获取已保存的实体(Propagation.REQUIRES_NEW)

时间:2016-05-06 09:17:49

标签: database spring hibernate jpa spring-transactions

我有一个要求,我需要将我的嵌套事务作为一个新事务,这样只有当异常不是调用者1时才会回滚当前事务,并且我还希望在嵌套事务中获取已保存的实体上层交易。

@Transactional(readOnly = false, isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public void A(){
//saving  entity x
B();
}

@Transactional(readOnly = false, isolation = Isolation.DEFAULT, propagation = **Propagation.REQUIRES_NEW**, rollbackFor = Exception.class)
public void B(){
//saving some other entity
//fetch previously created entity x

}

现在问题是当我尝试在B()中获取保存在A()中的实体x时,我没有得到它。

但如果我将B()的事务类型从Propagation.REQUIRES_NEW更改为Propagation.REQUIRED ,则可以正常工作。在这种情况下的问题是如果事务B被回滚,事务A也会,但这不是预期的。 请提出一些解决方案来解决这两个用例。

1 个答案:

答案 0 :(得分:1)

执行B()时,您的A()交易未提交。 因此,在B()中获取元素时,您将获得仅保存在数据库中的内容。那时你的实体x不在那里。

第一个问题是:为什么需要在B()中获取实体x? 第二个问题是:如果你需要B()中的实体x,你不能把它作为参数传递吗?