可以/全局事务跨多个线程吗?

时间:2013-06-01 14:54:14

标签: java transactions messaging jta

我们正在使用JTA来管理servlet上下文中的全局事务。另外,一些servlet线程正在调用异步bean。目前,我已经设计了一种方式,以便异步bean(工作管理器)获得自己的事务。

我的理解是两个线程可以参与同一个XA事务。但是,如果我开始使用servlet创建的事务,对于异步bean,是否会阻塞servlet线程,直到所有参与者都已提交或回滚? servlet和异步bean都可以提交和回滚。

应用服务器是WebSphere,我们不使用Spring。

感谢您的回复。

1 个答案:

答案 0 :(得分:2)

对于servlet线程和异步工作者,使用相同的事务会以某种方式与消息传递的一般概念发生冲突。消息传递是一种解耦的手段,而事务则将事物紧密地结合在一起。

换句话说,如果你想让一个worker使用同一个事务,我就不会以异步方式实现worker。

对于参与同一XA事务的两个线程,可能不支持此功能,请查看here以获取详细信息。即使它起作用,通常在线程上下文中共享资源(文件句柄,连接,事务等)也很麻烦。

至于servlet线程,它是否阻塞:我从未尝试过(由于上述原因),但我认为它没有阻止:你必须等待/轮询你的异步工作者,直到他们完成(或失败)。否则servlet就会到达你的commit语句。