是否可以在CompletableFuture中使用Transactional ?



我得到这个异常(有时它工作,有时失败)


HibernateException: Could not get the transaction-synchronized Session for current thread

我试图在数据库中保存两个实体事务,这是伪代码:

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

您正在启动与@Transactional的事务,但您正在从另一个线程执行saveSecondEntity。一般来说,J2EE/Spring不允许您创建自己的线程,因为它们是由容器管理的:在内部,诸如事务或安全性之类的事情都与线程绑定在一起。

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

最新更新