Spring Boot 将事务(和数据库连接)传播到 @Async 方法

Ben*_*nny 0 java spring multithreading spring-transactions spring-boot

我们遇到了以下问题:我们有一些服务 bean 进行一些处理,并将迭代一个集合并为每个条目启动一个异步线程,如下所示:

@Service
public class ServiceBean {
  @Autowired
  private AsyncHandler asyncHandler;

  public void doService(Set<?> theSet) {
    for (Object obj : theSet) {
      Future<?> future = asyncHandler.doHandle(obj);
      // ...
    }
    // wait for all futures to complete
  }
}

@Service
public class AsyncHandler {
  @Async
  public Future<?> doHandle(Object object) {
    // dosth
    return future;
  }
}
Run Code Online (Sandbox Code Playgroud)

现在我们看到每个线程将持有自己的事务,从而持有自己的数据库连接,这将导致连接池运行非常快。

跨所有线程共享事务的理想方式是什么?

提前致谢!

Ste*_*oll 5

跨所有线程共享事务的理想方式是什么?

不要那样做。这使得很难理解正在发生的事情。将事务附加到创建它的线程是有原因的。我猜您的计划是启动所有这些异步线程,然后等待它们完成以发送提交信号。

如果你不这样做,谁来完成交易?如果一个线程回滚事务,其他仍在使用它的线程会发生什么?您Connection显然可以绕过,但我希望无论如何都会将事情序列化,因为大多数连接实现都synchronized在不同的地方使用。