【问题标题】:Is it possible to use Transactional with CompletableFuture是否可以将 Transactional 与 CompletableFuture 一起使用
【发布时间】:2021-05-15 14:36:19
【问题描述】:

我遇到了这个异常(有时有效,有时失败)


HibernateException: 无法获取当前线程的事务同步会话

我正在尝试使用 Transactional 将两个实体保存在数据库中,这是伪代码:

@Override  
@Transactional  
public CompletableFuture<String> commit(MyRequest request) {   
  String documentCode = "dummy-id";
  return commit(documentCode, request)
    .thenApply(
        taxResult -> {
          saveSecondEntity(taxResult); // Exception here
          return documentCode;
        })
        .exceptionally(
                throwable -> {
                  // org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
                  logThrowable(request, throwable);

                  return null;
                });
}

我进一步检查了TransactionSynchronizationManager.isActualTransactionActive()saveSecondEntity 方法中返回false 并且线程名称也不同。

是否可以通过 CompletableFuture 使用 Transactional?

【问题讨论】:

    标签: spring-boot hibernate transactions


    【解决方案1】:

    您正在使用@Transactional 启动事务,但您正在从另一个线程执行saveSecondEntity。一般来说,J2EE/Spring 不会让您创建自己的线程,因为容器会管理它们:在内部,诸如事务或安全性之类的东西都与线程相关联。

    除此之外,Hibernate 会话(和底层 JDBC 连接)不是线程安全的,所以这样做不是一个好主意

    【讨论】:

      猜你喜欢
      • 2019-07-31
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      • 2016-04-01
      • 2011-01-20
      • 2018-08-11
      • 2021-08-05
      • 2019-03-18
      相关资源
      最近更新 更多