XA Transactions(2Phase Commit):A Simple Guide

コンピューティングの初期の頃は、分散トランザクションの必要はありませんでした。 アプリケーションの数が増加するにつれて、データの同期が重要な問題になります。 企業は、データフローの面で同期されたシステムを維持するために多くを支払った。 その結果、XA(eXtended Architecture)と呼ばれる2段階コミットプロトコルが生まれた。 このプロトコルは、グローバルトランザクション処理のためのACIDのようなプロパティを提供します。 この記事では、Xaトランザクションの詳細とSpring frameworkでのXAトランザクションの使用について説明しようとします。

2phase commit protocolは、分散システム用のアトミックコミットプロトコルです。 その名前が示すように、このプロトコルは二つのフェーズで構成されています。 最初のフェーズはcommit-requestフェーズで、トランザクションマネージャはコミットまたは中止するすべてのトランザクションリソースを調整します。 コミットフェーズでは、トランザクションマネージャは、各トランザクションリソースの投票に応じてコミットまたは中止することによ 次に、2PCプロトコルの実装の詳細に移ります。
*2PCを介したJava+.NETの相互運用性に関するリソースについては、こちらを参照してください。

XAトランザクションには、xaリソースごとにグローバルトランザクションidとローカルトランザクションid(xid)が必要です。 各XAリソースは、start(xid)メソッドによってXA Managerに登録されます。 このメソッドは、xaリソースがトランザクションに関与していることを通知します(操作の準備ができています)。 その後、2PCプロトコルの最初のフェーズは、prepare(xid)メソッドを呼び出すことによって実現されます。 このメソッドは、XAリソースからOKまたはABORT投票を要求します。 各XAリソースからの投票を受信した後、XA Managerは、すべてのXAリソースがOKを送信した場合にcommit(xid)操作を実行するか、XAリソースがABORTを送信した場合にrollback(xid)を実行す 最後に、トランザクションが完了したことを伝えるxaリソースごとにend(xid)メソッドが呼び出されます。 よりよく理解するために図を見てください。 XAトランザクション実装の背景を構築する際には、次に詳細に進み、失敗の種類と可能な解決策を見ていきます。


障害は、ネットワークの損失、マシンのダウン、および管理者のミスのためにいつでも発生する可能性があります。 XAトランザクションでは、これらの失敗を発生するフェーズに応じて分類します。 最初の障害フェーズは、プロトコルが開始される前です。 これは、システムがロールバックまたは任意の種類の操作を必要としない単純な障害です。 私たちはその特定の瞬間のために操作をしません。 第二のタイプの失敗は、タイムアウトポリシーを使用してロールバックによって簡単に処理できる準備(commit-request)フェーズで発生する可能性があります。 最後になりましたが、不完全なロールバックとチェーン内の問題のために発生する可能性のあるコミットフェーズの失敗です。 上記のすべての状況で、transaction managerは問題を回復しようとします。 次に、transaction managerがどのように障害を克服しようとしているかを見ていきます。

リカバリのために、transaction managerは各XAリソースのrecoverメソッドを呼び出します。 XAリソースはログをトレースし、最新の状態を再構築しようとします。 Transaction Managerは必要なロールバック操作を呼び出し、ミッションを実行します。 このプロセスは幸せな道に見えるかもしれませんが、ログが破損しているような問題がある例外的な状況がたくさんあります。 このような状況では、transaction managerは問題を解決するためにいくつかのヒューリスティックに従います。 さらに、回復プロセスは、適用する前に操作ログを書き込む先の先読みログに依存します。 パフォーマンスの問題については、これらのログは独自の形式で書かれており(シリアル化を使用していません)、可能であればシステムはそれらをバッ 次に、Spring frameworkによるXAトランザクションサポートである楽しい部分に行きます。

Spring frameworkは、webおよびスタンドアロンアプリケーションを開発するための広範な環境を提供します。 それが提供する他のユーティリティと同様に、XaトランザクションもSpringでサポートされています。 ただし、このサポートはネイティブ実装ではなく、hibernate、webコンテナ、またはXAトランザクション管理を提供するフレームワークが必要です。 Springには、トランザクション管理ユーティリティを提供し、詳細を隠すJtaTransactionManagerがあります。 このようにして、同時に更新される複数のデータソースのトランザクション管理を行うことができます。 XAトランザクション管理を使用する場合、xaトランザクションのhibernateとwebコンテナのサポートは十分に文書化されており、言及する必要はありません。 ただし、XAトランザクションを提供するフレームワークを使用すると、混乱する可能性があります。 したがって、私はBitronix Transaction Managerを導入して、この記事を続けます。

Bitronixは、トランザクション管理のための優れたサポートを提供しながら、簡単に構成されています。 これは、スタンドアロンアプリケーションでは一般的に使用されていませんが、私は次のようにスタンドアロンアプリケーションの設定を与

<bean factory-method="getConfiguration" class="bitronix.tm.TransactionManagerServices"> <!--Disabling Jmx avoids registering JMX Beans to any container--> <property name="disableJmx" value="true" /></bean><bean factory-method="getTransactionManager" class="bitronix.tm.TransactionManagerServices" depends-on="bitronixTMConfig" destroy-method="shutdown"/><bean class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="transactionManager" ref="bitronixTM" /> <property name="userTransaction" ref="bitronixTM" /> <property name="allowCustomIsolationLevels" value="true" /></bean>

これで、次のように構成できる複数のデータソースを持つことができます。 各データソースには、一意のuniqueNameプロパティが必要です。 以下の構成はOracle用で、他のデータベースは異なる構成を持つことができます。 その他の詳細については、Bitronixのウェブサイトを確認することができます。

<bean class="bitronix.tm.resource.jdbc.PoolingDataSource" init-method="init" destroy-method="close"> <property name="uniqueName" value="xaDataSource" /> <property name="minPoolSize" value="1" /> <property name="maxPoolSize" value="4" /> <property name="testQuery" value="SELECT 1 FROM dual" /> <property name="driverProperties"> <props> <prop key="URL">jdbc:oracle:thin:@10.6.86.24:1521:test</prop> <prop key="user">test</prop> <prop key="password">test</prop> </props> </property> <property name="className" value="oracle.jdbc.xa.client.OracleXADataSource" /> <property name="allowLocalTransactions" value="true" /></bean>

要約すると、XAトランザクション、基礎となるプロトコル、およびスタンドアロンアプリケーションでのSpringとのBitronixトランザクション管理統合とは何かを説 拡張するために、XA Transactionsは異なるデータソースを同時に変更することを提供します。 さらに、xaトランザクションはwebコンテナやhibernateのようなフレームワークでサポートされています。 それにもかかわらず、transaction managerを構成する必要があるスタンドアロンアプリケーションにtransaction managementを統合する必要がある場合があります。 その結果、XA transactionは複数のデータソースに対して一貫した操作を提供し、企業はそれらを利用します。
*学芸員のメモと追加リソース

You might also like

コメントを残す

メールアドレスが公開されることはありません。