在当前事务中使用@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()
使用现有事务