21

私はJTAを理解しようとしており、(学習と理解のために)選択したトランザクションマネージャーとしてBitronixを使用しています。ここでBitronixリファレンスガイド内のコードを見ていて、自分自身に疑問を持っています。それ自体がトランザクションである(Connectionコミット/ロールバックできる)JDBCを使用している場合、なぜそのようなコードを書きたいのでしょうか。 !?!

そのコードスニペットのポイントは、既存のトランザクションデータストアでBitronix / JTAを使用する方法を簡単に示すことだったかもしれませんが、それが提供する固有の利点はまだわかりません。

次に、このコードスニペットは私に次のように考えさせました。「使用する2つの主要なデータソースがデータベースとメッセージブローカーのみであり、JDBC / JMSを使用してそれぞれ通信し、これら2つの標準(JDBC / JMS)がすでにトランザクションである場合、なぜJTAを使用する必要があるのでしょうか?!?!

JTAは、JDBC、JPA、JMSなどがすべて使用する「内部」JavaEEAPIのようなものですか。そして、それで何かクレイジーなことをしたい1%の人たちだけに公開されていますか?それとも、JTAのアイデア/適用性を完全に見逃していますか?

JTAを直接ヒットするための2つの非JDBCと非JMSのユースケースを想像できると思いますが、そもそもJTAについては非常に曖昧なので、これらのケースが軌道に乗っていないかどうかはわかりません。

  • おそらく、アプリに複雑なI / Oシステムがあり、ディスク上の同じファイルに対して複数のスレッドが読み取り/書き込みを行っている可能性があります。おそらく、各スレッドにトランザクションを使用してこのファイルに書き込むようにします。(はい・いいえ?!?)
  • おそらく、システムの状態を表すステートマシンPOJOがあり、複数のスレッドがマシンを変更できます。おそらく、各スレッドにトランザクションを使用してマシンの状態を変更させるでしょう。(はい・いいえ?!?)

私の質問の根本は次のとおりだと思います。

  • JPA(Hibernate)および/またはJDBC呼び出しがすでにトランザクションである場合、なぜそれらをJTA begin-> commit / rollbackブロック内にラップしたいのですか?JMSおよびメッセージングシステムの場合も同様です。
  • JPA / JDBC / JMS以外に、JTAを使用して一連の操作を処理するためのユースケースは何ですか?

前もって感謝します!

4

3 に答える 3

26

オープントランザクションをロールバックするだけではありません。JTAはプロバイダーが実装できるXAResourceインターフェイスを提供し、JDBCドライバーとJMSプロバイダーはすでにこれを実行しており、独自に実装できます。これはオープンスタンダードに基づいており、おそらく読む価値があります。

では、なぜこれが必要なのでしょうか。

災害時のマシューズの例を考えてみましょう。

Begin DB Transaction

Set AccountBalance $100 lower for Account #345 in database

Add JMS Message "Transfer $100 to OtherBank Account #987" to queue

*** DB power is unplugged while committing DB Transaction ***

残念ながら、JMSメッセージは他の銀行に送信されました。これは分散トランザクションの非常に現実的な問題です。

XAでは、次のようにシナリオが実行されます。

DB Transation starts XA Transaction

Set AccountBalance $100 lower for Account #345 in database

JMS Connection joins XA Transaction 

Add JMS Message "Transfer $100 to OtherBank Account #987" to queue

Everything went okay and JTA context is ready to commit.

DB and JMS both agree that they are capable of commiting.

JTA instructs DB and JMS to commit.

All members of the transaction commit.

ここで、DBの最後のコミット中に電源プラグが抜かれた場合にどうなるかを尋ねることができます。JMSキューはコミットされますが、XAトランザクションは、DBが再び使用可能になるまで開いたままになり、DBが再び使用可能になると、DBにコミットするように再度指示されます(DBは、コミットできると約束しました。これは、XA準拠の一部です。 )。

JTAの本当に素晴らしい点は、独自のカスタムXAResourceを簡単に実装して、この優れたフレームワークに結び付けることができることです。

アップデート

したがって、カスタムトランザクションをいつ実装するかについての質問に答えるには、次のことを自問してください。

  1. カスタム状態またはファイルをトランザクションスコープの最後のコードブロックにすることはできませんか?
  2. 外部システム(つまり、DBまたはJMS)に障害が発生した場合、カスタム状態/ファイルを元に戻す必要がありますか?
  3. 外部システム用の単純なgetRollbackOnly()とsetRollbackOnly()は、カスタムコードの補正処理(つまり、カスタム状態/ファイルを明示的に戻す)と組み合わせて不十分ですか?

1、2、3の両方の答えが「はい」の場合は、おそらくカスタムXAResourceが必要です。そうでない場合は、おそらくやり過ぎだと思います。

ただし、コードがJava EEスペースのビジネスロジックに参加するフレームワークまたはライブラリである場合は、XAResourceを実装することをお勧めします。

于 2012-07-02T10:41:48.670 に答える
3

データベースとメッセージサービスの両方をカバーする1つのトランザクションを持つことができます。JTAなしでそれを行う方法はわかりません。

簡単な概念例。正確なコードは重要ではありません。

JTAトランザクションを開始します

データベースのアカウント#345のAccountBalanceを$100低く設定します

JMSメッセージ「$100をOtherBankアカウント#987に転送」をキューに追加します

JTAトランザクションをコミットする

OtherBankは別の銀行であり、JMSを介して通信することを前提としています。

トランザクションの開始とコミットはJTAによって処理されます。キューへの追加に失敗した場合、引き出しも自動的にロールバックされます。

実生活はそれほど単純ではありませんが、これはあなたにアイデアを与えるはずです。

編集:

JTAは、システムの一部がを正しく実装できる場合はいつでも使用できますXAResource。これを実装することで、リソースは分散トランザクションに参加できます。一見すると、提案された両方の例で実装できる可能性がありますXAResource

「アプリ内の複雑なI/Oシステムであり、ディスク上の同じファイルに対して複数のスレッドが読み取り/書き込みを行っています。」-考えてみれば、データベースのようですね。

「おそらく、システムの状態を表すステートマシンPOJOがあり、複数のスレッドがマシンを変更できます。」-変更を十分に分離できれば、これは間違いなく候補になる可能性があります。

ルーブリックの最初の部分は、基本的にリソースが論理的にsである可能性があるということだと思いますXAResource。言い換えれば、ACIDの概念には意味があります。2つ目は、そのインターフェースを実装することは可能であり、努力する価値があるということです(まだ実装されていない場合)。

于 2012-06-29T17:26:26.993 に答える
0

私の意見では、最初の考慮事項は、TXマネージャーとTXシステムを装飾することです。

アプリケーションを設計するとき、Transactionalという単語は、ACIDを実行する意図を示しています。これはビジネスニーズによって推進される必要があるため、このインテントをビジネスコードに入れたいと思います。

基盤となるTXシステム(データベース、jmsブローカーなど)に応じて、何か魔法(実際のコンテナ)がtxインテントを正しく織り込むことを期待しています。

さらに、JTAは、既存のJTAシステムと(最終的には新しい、最終的にはエキゾチックな)TXシステムとの統合を可能にするいくつかのインターフェースを定義します。例:GigaSpacesXAPはメモリ内のデータグリッドです。これはJMSでもSQLでもありませんが、JTA統合を提供するため、簡単に作成できます。他の多くの製品を引用することができます...

明らかに、キラーな例は、異なるシステム間のXAトランザクションのサポートです(私はジャスティンにポイントを与えます)。私の言いたいことは、XAトランザクションを使用しなくても、JTAには価値があるということです。

于 2015-09-21T16:49:00.907 に答える