spring-boot - 是否可以将 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()
返回值也不同。false
saveSecondEntity
是否可以使用 Transactional with CompletableFuture
?
解决方案
您正在开始一个事务,@Transactional
但您正在saveSecondEntity
从另一个线程执行。一般来说,J2EE/Spring 不允许您创建自己的线程,因为容器管理它们:在内部,诸如事务或安全性之类的东西与线程相关联。
除此之外,Hibernate 会话(和底层的 JDBC 连接)不是线程安全的,所以这样做不是一个好主意
推荐阅读
- typescript - 如何处理泛型中的函数重载
- linkedin - 是否可以通过 API 搜索帐户并根据其公司网站获取关注者?
- python - 在 Numpy 中删除空行的精明方法
- unity3d - 在实例化对象的脚本中获取 Prefab - Unity 2D
- java - 使用 squareup.wire 在 proto 中获取 nestedTypes 的原始模式
- sql-server - 触发器适用于 UPDATE/INSERT,但在通过 BCP 运行时失败(日期格式问题)
- javascript - 将鼠标光标悬停在左列的滚动条上时保存右列的内容
- perl - ld:无法识别的选项'-Wl,-O1'
- amazon-web-services - AWS QuickSight:将视觉对象连接到多个数据集
- python - 使用类时出现 NameError