在 spring @Transactional 中使用 CompletableFuture
using CompletableFuture inside spring @Transactional
我正在使用标记为交易的 api。它在其中使用可完成的未来来保持异步。所以 api 看起来像:
@Transactional
public Response executeJob (Request request){
//check if job is already in progress using db read
//if not -> create new job put it in progress and start
//if previously failed -> update job status to in progress and restart
//update job status in DB
//submit job to completable future -> preforms lots of db reads and writes
//return Response details
}
问题:
如果大量用户同时触发请求,我们将获得重复记录。
我尝试在互联网上搜索,但无法理解交易和可完成的未来将如何在这里工作。我的意思是一旦返回响应或一旦可完成的未来完成,交易就会结束。
主要观察:
我自己使用虚拟 api 尝试了几个案例。在可完成的未来的情况下,总是为新线程启动一个新事务。不管它是否被事务注解,如果它被一个事务方法调用,它将为这个线程创建一个新的事务。
如果我们使用这个可完成的未来返回的结果,也可能是最初开始的事务已经完成,现在如果我们试图持久化一些需要在事务中的东西,它可能会因为没有活动事务而失败。如果这似乎在任何地方都不正确或者是否需要更清楚的说明,请告诉我
我正在使用标记为交易的 api。它在其中使用可完成的未来来保持异步。所以 api 看起来像:
@Transactional
public Response executeJob (Request request){
//check if job is already in progress using db read
//if not -> create new job put it in progress and start
//if previously failed -> update job status to in progress and restart
//update job status in DB
//submit job to completable future -> preforms lots of db reads and writes
//return Response details
}
问题: 如果大量用户同时触发请求,我们将获得重复记录。
我尝试在互联网上搜索,但无法理解交易和可完成的未来将如何在这里工作。我的意思是一旦返回响应或一旦可完成的未来完成,交易就会结束。
主要观察: 我自己使用虚拟 api 尝试了几个案例。在可完成的未来的情况下,总是为新线程启动一个新事务。不管它是否被事务注解,如果它被一个事务方法调用,它将为这个线程创建一个新的事务。 如果我们使用这个可完成的未来返回的结果,也可能是最初开始的事务已经完成,现在如果我们试图持久化一些需要在事务中的东西,它可能会因为没有活动事务而失败。如果这似乎在任何地方都不正确或者是否需要更清楚的说明,请告诉我