【问题标题】:Atomikos vs. Bitronix vs. JBossTS - MVCC and Nested TransactionsAtomikos vs. Bitronix vs. JBossTS - MVCC 和嵌套事务
【发布时间】:2011-10-05 22:10:38
【问题描述】:

我想实现一个以前的事务管理器。但是,由于我仍处于概念阶段,我想尝试所有这些事务管理器。我最终选择的标准是易用性、Tomcat 的使用、适应性以及最重要的是对嵌套事务和 MVCC 的支持。

我无法找到任何有关可能支持 Bitronix 和 Atomikos 的后者标准的信息。

我知道 JBossTS 支持 MVCC 和 NT - 但我不确定 JBoss 是否会是一个不错的选择,因为 JBoss 的使用会带来巨大的开销……尤其是对于 Spring 和 hibernate 的用户。

您知道 Atomikos 和/或 Bitronix 是否符合我的标准 - 还是实施我自己的 TM 会更好?

【问题讨论】:

    标签: java jboss atomikos


    【解决方案1】:

    您需要更清楚地定义您的要求。 “嵌套事务”是模棱两可的。这可能意味着简单地暂停一个事务以运行另一个事务,然后恢复第一个事务:

    transactionManager.begin();
      // now in tx A
    transaction txA = transactionManager.suspend();
      // no tx active here
    transactionManager.begin();
      // now in tx B
    transactionManager.commit(); // tx B ends
      // no tx active here
    transactionManager.resume(txA);
      // now in tx A again
    transactionManager.commit(); // tx A ends
    

    这在您需要执行某些操作时很常见,例如审计日志更新,在逻辑上与外部事务分开。任何事务管理器都会这样做,尽管很少编写如此直接驱动 TM 的代码。请改用 EJB 容器。

    然后,您只是想要伪嵌套来简化逻辑结构:

      // no tx active at start
    transactionManager.begin();
      // tx A now active, nesting count = 1
    transactionManager.begin();
      // tx A still active, nesting count = 2
    transactionManager.commit();
      // nullop, tx A still active, nesting count = 1
    transactionManager.commit();
      // tx A really committed, no tx active, count = 0.
    

    乍一看,这看起来很吸引人,但是当发生嵌套回滚时,它会带来更多的麻烦。未得到广泛支持,尽管一些数据库允许这样做以简化存储过程的处理。

    终于有了真正的嵌套事务,其中子事务从其父事务继承锁,并在完成时将自己的锁传递给该父事务

    transactionManager.begin();
      // now in tx A1
    transactionManager.begin();
      // now in tx A1.1
      // can see uncommitted changes made by A1
    transactionManager.commit(); // validate ability to make A1.1 changes permanent, but do not actually do so yet
      // now in tx A1, still holding locks from A1.1 also
    transactionManager.commit(); // commit A1 and A1.1 changes atomically.
    

    这主要用于故障隔离 - 可以回滚子事务并执行其他操作,而不会对外部事务造成任何影响。这是一个非常强大的事务模型。实现起来也很棘手——目前只有 JBossTS 支持它。并不是说它在大多数 Java EE 用例中对您有多大好处,因为没有资源管理器(即数据库或消息队列)支持它。

    至于 MVCC,这与事务管理器完全无关。您的业​​务数据保存在资源管理器中,通常是关系数据库。 RM 用于提供 tx 隔离和并发控制的模型与驱动事务的方式是正交的。 Oracle 和 postgres 偏爱 MVCC,而其他一些 dbs 偏爱表、页或行级锁定。事务管理器不知道也不关心。

    【讨论】:

      【解决方案2】:

      newsgroup post 提到,截至 2010 年,Bitronix 还没有支持嵌套事务的计划,而且它们似乎确实有点奇怪。

      Atomikos TransactionsEssentials datasheet 将嵌套事务列为一项功能。

      【讨论】:

      • 谢谢,这基本上限制了我对 Atomikos 的选择——JBossTS 需要 J2EE 环境,而 Bitronix 不支持 NT。然而,在这两种情况下,关于 MVCC 的问题仍然存在。
      【解决方案3】:

      不仅 JBoss 支持嵌套事务:Atomikos 也是如此...嵌套事务对经典 (XA) 事务没有那么有用,但它们对高级 SOA 事务模型(如 Atomikos TCC(尝试-确认/取消))有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多