我有一个要求,我需要将我的嵌套事务作为一个新事务,这样只有当异常不是调用者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也会,但这不是预期的。 请提出一些解决方案来解决这两个用例。
答案 0 :(得分:1)
执行B()
时,您的A()
交易未提交。
因此,在B()
中获取元素时,您将获得仅保存在数据库中的内容。那时你的实体x不在那里。
第一个问题是:为什么需要在B()
中获取实体x?
第二个问题是:如果你需要B()
中的实体x,你不能把它作为参数传递吗?