java - 嵌套 @Transactional(propagation = Propagation.REQUIRES_NEW) 是否创建新的 Hibernate session ?

标签 java spring hibernate spring-transactions

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

如果上述情况成立,是否有一种方法可以仅使用一个 session 来处理所有事务?

这是一个直观的示例:

@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 中吗?

最佳答案

您已绑定(bind) Spring @Transactional 注释。

通常情况下,即使存在现有事务,Propagation.REQUIRE_NEW也会启动一个新事务。

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

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

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

相关文章:

java - Eclipse:查找 Java 和 JSF/JSP 中的引用

java - 子字符串 IndexOutOfBoundsException

java - 在 Spring Batch 中将当前时间戳作为作业参数传递

java - Vaadin 应用程序与 MySQL 数据库

java - 使用 Spring 3.0.5 将 Jasper Reports 导出为 XLSX 格式

java - 分离的对象如何在 hibernate 中工作

java - 如何在 Hibernate Spring 中级联 CollectionElement

java输入流不读取前导十六进制字节

java - 仅打印绝对 URL

hibernate - HQL 批量插入