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

时间:2016-10-26 07:01:22

标签: java spring multithreading spring-boot spring-transactions

我们遇到以下问题:我们有一些服务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;
  }
}

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

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

提前致谢!

1 个答案:

答案 0 :(得分:4)

  

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

不要这样做。这让人很难理解发生了什么。将事务附加到创建它的线程的原因就在于此。我想你的计划是启动所有这些异步线程,然后等待它们完成发送提交信号。

如果您不知道,谁将完成交易?如果一个线程回滚事务,那么仍在使用它的其他线程会发生什么?您可以明确地传递Connection,但我希望事情能够序列化,因为大多数连接实现都在不同的地方使用synchronized