CompletableFuture 事务回滚

问题描述 投票:0回答:1

给出这段代码:

@Async
@Transactional
public CompletableFuture<Optional<Bundle>> newBundle(String name){
return CompletableFuture.supplyAsync(() -> {
    Bundle newBundle = bundleRepository.save(new Bundle(name));
    messageRepository.save(new Message("saved new bundle with name {}", name);
    return Optional.of(newBundle);
}).exceptionally(throwable -> {
    log.error(throwable.getMessage(), throwable);
    throw new IllegalArgumentException(throwable);
);
}

所以当电话

messageRepository.save(new Message("saved new bundle with name {}", name);
失败了,

会有回滚吗

bundleRepository.save(new Bundle(name));

java spring-boot completable-future
1个回答
0
投票

@Transactional
注解的工作原理是围绕带注解的方法创建一个代理来管理事务。但是,其有效性可能取决于调用方法的方式和位置,尤其是在异步操作中。

根据您的代码片段,您将

@Async
@Transactional
一起用于返回
CompletableFuture
的方法。

事务上下文:

@Transactional
注释在方法执行开始时创建事务上下文。此方法中发生的任何操作都应该是此事务上下文的一部分。

异步执行:使用

CompletableFuture.supplyAsync(...)
异步运行提供的任务,可能在不同的线程上。在
newBundle
方法开始时创建的事务上下文可能不会自动传播到执行 bundleRepository.save(...) 和
messageRepository.save(...)
的新线程。这意味着这些存储库调用可能不会参与同一事务,除非您显式配置方法执行和事务传播来支持此模式。

© www.soinside.com 2019 - 2024. All rights reserved.