在使用@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注释。

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

但是,如果您在本地调用newChildTransaction(只是在同一方法内),则spring AOP将没有机会与@Transaction注释进行交互。

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

关于java - 嵌套@Transactional(propagation = Propagation.REQUIRES_NEW)是否创建新的Hibernate session ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50177838/

10-10 18:40