给出这段代码:
@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));
@Transactional
注解的工作原理是围绕带注解的方法创建一个代理来管理事务。但是,其有效性可能取决于调用方法的方式和位置,尤其是在异步操作中。
根据您的代码片段,您将
@Async
与 @Transactional
一起用于返回 CompletableFuture
的方法。
事务上下文:
@Transactional
注释在方法执行开始时创建事务上下文。此方法中发生的任何操作都应该是此事务上下文的一部分。
异步执行:使用
CompletableFuture.supplyAsync(...)
异步运行提供的任务,可能在不同的线程上。在 newBundle
方法开始时创建的事务上下文可能不会自动传播到执行 bundleRepository.save(...) 和 messageRepository.save(...)
的新线程。这意味着这些存储库调用可能不会参与同一事务,除非您显式配置方法执行和事务传播来支持此模式。