【发布时间】:2017-11-18 03:10:22
【问题描述】:
我们在业务层方法上使用 Spring @Transactional 注解。当我们迁移到 Java 8 时,这些方法已被转换为使用 Java 8 的异步特性并使用可完成的 Futures 并将多个异步调用链接到数据层。例如。
@Transactional
public CompletableFuture<Entity> updateEntity(ID id) {
repository1.get(id)
.thenComposeAsync(item -> repository1.save(), executor);
}
上面的代码演示了我们想要链接多个数据库层异步调用。
@Transactional注解此时似乎只支持阻塞调用,所有事务上下文信息都保存在ThreadLocal中。上述方法创建了 3 个交易。一旦返回未来,外部事务就会开始并完成。 repository1.get(id) 在另一个事务中运行,repository1.save() 在它自己的事务中运行。
是否有一种标准方法可以在单个事务中运行多个异步调用,而无需重写事务拦截器。似乎我们还需要将TransactionSynchronizationManager 中的线程局部变量从一个线程复制到另一个线程,以使其在单个事务中执行。
如果 Spring 团队计划增强 spring-tx 以支持此用例,请感谢他们的反馈。
【问题讨论】:
-
好问题,但众所周知,spring transactional 绑定到单个线程 - 我非常怀疑是否有可能做你想做的事
标签: spring java-8 spring-data spring-transactions completable-future