1

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

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

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

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

4

3 回答 3

3

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

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 偏爱表、页或行级锁定。事务管理器不知道也不关心。

于 2011-10-06T12:59:16.777 回答
1

这篇新闻组帖子提到,截至 2010 年,Bitronix 还没有支持嵌套事务的计划,而且它们似乎确实有点奇怪。

Atomikos TransactionsEssentials 数据表将嵌套事务列为一项功能。

于 2011-10-05T22:30:14.807 回答
0

不仅 JBoss 支持嵌套事务:Atomikos 也是如此……嵌套事务对经典 (XA) 事务没有那么有用,但它们对高级 SOA 事务模型(如 Atomikos TCC(Try-Confirm/Cancel))有用。

于 2011-10-17T18:47:25.033 回答