我们遇到以下问题:我们有一些服务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;
}
}
现在我们看到每个线程都将拥有自己的事务,从而保持数据库连接,这将导致连接池非常快地运行。
在所有线程中共享事务的理想方式是什么?
提前致谢!
答案 0 :(得分:4)
不要这样做。这让人很难理解发生了什么。将事务附加到创建它的线程的原因就在于此。我想你的计划是启动所有这些异步线程,然后等待它们完成发送提交信号。在所有线程中共享事务的理想方式是什么?
如果您不知道,谁将完成交易?如果一个线程回滚事务,那么仍在使用它的其他线程会发生什么?您可以明确地传递Connection
,但我希望事情能够序列化,因为大多数连接实现都在不同的地方使用synchronized
。