我得到这个异常(有时它工作,有时失败)
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连接)不是线程安全的,所以这样做不是一个好主意