如何在multithreading之间共享一个事务

我们遇到了一个适用于multithreading的场景。

在主线程中,做一些逻辑并更新数据库,在某一点上,它会调用另一个服务来更新数据库,这是在另一个线程中运行的。

我们希望两个线程共享相同的事务,这意味着,任一线程中的任一操作都失败,那么另一个线程中的操作也将被回滚。

但是工作了好几天,我发现一些post说JTA不支持multithreading。 目前我们使用Bitronix作为JTA提供程序,有没有人知道Bitronix是否支持一个Transaction中的multithreading? 或者是否有任何其他JTA提供程序支持此(独立JTA提供程序而非J2EE容器)?

“多个线程可能同时与同一个全局事务关联。” – JTA规范v1.1,第3.2节,第13页。

JBossTS将处理没问题。 除了检查交易行为之外,困难实际上并不是事务管理器。 您还需要正确处理与资源管理器(即数据库)的连接。 如果您在线程之间共享一个连接,则不一定会以串行方式运行任何加速,因为除非驱动程序支持高效多路复用,否则它可能成为瓶颈。 另一方面,如果您使用多个连接,则需要确保驱动程序能够合理地实现isSameRM以避免2PC,并且如果线程需要看到彼此对数据库的未提交更改,则还允许事务分支锁共享(紧密耦合)。 所以除了一个好的事务管理器之外,你还需要一个好的连接管理器,例如JCA实现和一个好的数据库驱动程序。 祝你好运。