嵌套@Transactional(传播 = Propagation.REQUIRES_NEW)是否会创建新的休眠会话?



在当前事务中使用@Transactional(propagation = Propagation.REQUIRES_NEW(启动新事务时,使用@Transactional(propagation = Propagation.REQUIRED)启动,是否为新事务创建了新会话?

如果上述情况属实,有没有办法对所有事务仅使用一个会话?

下面是一个可视化示例:

@Transactional(propagation = Propagation.REQUIRED
public void startParentTransaction() {
ChildObject childObject = newChildTransaction();
childObject.lazyLoadedAttribute();
ChildObject childObject = newChildTransaction();
childObject.lazyLoadedAttribute();
}
@Transactional(propagation = Propagation.REQUIRES_NEW
public ChildObject newChildTransaction() {
ChildObject childObject = callRepositoryOrDao();
childObject.changeState();
return childObject;
}

childOjbect.lazyLoadedAttribute()的调用会起作用吗? 还是会扔LazyInitializationException

我们可以将所有交易都发生在一个Session吗?

你绑定到 Spring@Transactional注释。

通常,即使存在存在事务,Propagation.REQUIRE_NEW也会启动新事务。

但是,如果您在本地调用newChildTransaction(只是在相同的方法中(,则 Spring AOP 没有机会与@Transaction注释进行交互。

因此,在这种情况下,newChildTransaction()使用现有事务

最新更新