首页 > 解决方案 > 是否可以将 Transactional 与 CompletableFuture 一起使用

问题描述

我收到此异常(有时有效,有时失败)


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()返回值也不同。falsesaveSecondEntity

是否可以使用 Transactional with CompletableFuture

标签: spring-boothibernatetransactions

解决方案


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

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


推荐阅读