嵌套的@Transactional(propagation = Propagation.REQUIRES_NEW)是否创建了一个新的Hibernate会话?

时间:2018-05-04 14:59:05

标签: java spring hibernate spring-transactions

在使用@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被抛出?

我们可以在一个body { font-family: Tahoma; font-size: 16px; } #point1 { font-family: Verdana; color: orange; margin-top: 10px; margin-bottom: 10px; } #point2 { font-family: Impact; color: red; margin-top: 10px; margin-bottom: 10px; } #point3 { font-family: Georgia; color: pink; margin-top: 10px; margin-bottom: 10px; } #point4 { font-family: Tahoma; margin-top: 10px; margin-bottom: 10px; }中进行所有交易吗?

1 个答案:

答案 0 :(得分:0)

你必须使用Spring @Transactional注释。

通常情况下,即使存在特定交易,Propagation.REQUIRE_NEW也会启动新交易。

但是如果你在本地调用newChildTransaction(只是在同一个方法中),那么spring AOP没有机会与@Transaction注释进行交互。

因此,在这种情况下,newChildTransaction()使用现有的交易