1

以前のトランザクションマネージャーの1つを実装したいと思います。ただし、私はまだコンセプトフェーズにあるので、これらすべてのトランザクションマネージャーを試してみたいと思います。最終的な選択の基準は、使いやすさ、Tomcatの使用、適応性、そして何よりもネストされたトランザクションとMVCCのサポートです。

BitronixとAtomikosの後者の基準のサポートの可能性に関する情報を見つけることができませんでした。

JBossTSがMVCCとNTをサポートしていることは知っていますが、JBossの使用によってもたらされる大きなオーバーヘッドに関してJBossが適切かどうかはわかりません...特にSpringとHibernateのユーザーに関しては。

Atomikosおよび/またはBitronixが私の基準に適合するかどうかを知っていますか?それとも私自身のTMを実装する方が良いでしょうか?

4

3 に答える 3

3

要件をより明確に定義する必要があります。「ネストされたトランザクション」はあいまいです。これは、別のトランザクションを実行するために 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 を支持しますが、他の一部のデータベースはテーブル、ページ、または行レベルのロックを支持します。トランザクション マネージャは知らないか気にしません。

于 2011-10-06T12:59:16.777 に答える
1

このニュースグループの投稿では、2010 年の時点で、Bitronix でネストされたトランザクションをサポートする計画はなく、それらはやや風変わりな要件のように思われると述べています。

Atomikos TransactionsEssentials データシートには、ネストされたトランザクションが機能としてリストされています。

于 2011-10-05T22:30:14.807 に答える
0

JBoss はネストされたトランザクションをサポートするだけでなく、Atomikos もサポートします... ネストされたトランザクションは、従来の (XA) トランザクションにはあまり役立ちませんが、Atomikos TCC (Try-Confirm/Cancel) のような高度な SOA トランザクション モデルには適しています。

于 2011-10-17T18:47:25.033 に答える