【问题标题】:how to share one transaction between multi threads如何在多线程之间共享一个事务
【发布时间】:2011-10-20 14:31:47
【问题描述】:

我们遇到了一个使用多线程的场景。

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

我们希望两个 Thread 共享同一个事务,也就是说,任何一个 Thread 中的操作失败,那么另一个 Thread 中的操作也会被回滚。

但是工作了几天,发现有些帖子说JTA不支持多线程。 目前我们使用 Bitronix 作为 JTA 提供者,有没有人知道 Bitronix 是否支持多线程在一个事务中?或者是否有任何其他 JTA 提供者支持这个(独立的 JTA 提供者而不是 J2EE 容器)?

【问题讨论】:

    标签: java multithreading transactions jta


    【解决方案1】:

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

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

    【讨论】:

    • 感谢 Uncredited!我已经检查了 JTA 规范。我确实找到了这些词。当我在 BTM 论坛上提问时,他们说 BTM 不支持此功能。有些人建议使用 Jboss TS 或 Atomics,我还没有尝试过这两个。
    • @scarlet 你找到解决方案了吗?请分享您的发现。
    • 我到现在都不知道,我改为只使用一个线程。你呢?
    • 来自 BTM 论坛:JTA 规范明确禁止事务跨越多个线程。解决这个问题的唯一标准方法是使用 Transaction.suspend() 暂停线程中的事务并使用 Transaction.resume() 在另一个线程上恢复它。
    猜你喜欢
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 2012-11-14
    • 1970-01-01
    相关资源
    最近更新 更多