18.2.3. WS_Transaction モデル

従来のトランザクションモデルはWeb Services には適していないと考えられています。多くの場合、Web サービストランザクションが利用される可能性が高く、特定のプロトコル1つでは十分ではありません。WS-Transaction 仕様では、2種類のモデルを提唱しており、特別なB2Bインターラクションのセマンティクスにも対応しています。
以下で、クライアント、Web サービス、トランザクションコーディネータ間のインターラクションについて触れていますが、多くの場合解説を目的としています。このアクティビティの多くは、裏側で自動的に行われています。トランザクションの開始、完了やパーティシパントの登録、コミットや中断プロセスを駆動するのに利用する実際のAPIについては、 21章XTS APIで説明されています。

18.2.3.1. アトミックトランザクション

atomic transaction (AT)は従来のACIDトランザクションに似ており、ACIDセマンティクスが適しているような短期間のインターラクションに対応するように設計されています。ATの範囲内で、Web サービスは通常ブリッジングを採用し、Web サービストランザクションの制御の下、データベースやメッセージキューなどXAリソースにアクセスできるようにしています。トランザクションが終了すると、パーティシパントはATの結果に関する判断をXA リソースに伝播し、適切なコミットあるいはロールバックアクションがそれぞれのリソースにより実行されます。
全サービスおよび関連のパーティシパントは、ACIDセマンティクスを提供すると考えられており、ACIDが適切な環境や状況でアトミックトランザクションが利用されると推測されます。通常、この環境は、短期で信頼できるドメインとなっています。

手順18.1 アトミックトランザクションのプロセス

  1. アトミックトランザクションを開始するには、クライアントアプリケーションをまず、WS-Transactionに対応するWS-C Activation Coordinator のWeb サービスに設置します。
  2. クライアントは、http://schemas.xmlsoap.org/ws/2004/10/wsatをコーディネータタイプとして指定するWS-C CreateCoordinationContext メッセージをサービスに送信します。
  3. クライアントは、アクティベーションサービスから適切なWS-Transaction コンテキストを受信します。
  4. CreateCoordinationContextメッセージへのレスポンスである、トランザクションコンテキストは、CoordinationType要素がWS-Atomic Transaction名前空間http://schemas.xmlsoap.org/ws/2004/10/wsatに設定されています。また、アトミックトランザクションのコーディネータエンドポイントであるWS-C Registration Service (ここでパーティシパントを登録可能) への参照を含みます。
  5. クライアントは通常次に進みWeb Services を呼出し、Web サービスが変更した内容すべてをコミットするかロールバックすることで、トランザクションを完了します。この完了アクティビティを行うには、クライアントはRegisterメッセージをCoordination Context にてエンドポイントを返されたRegistration Service へ送信することで、自身をCompletionプロトコルのパーティシパントとして登録する必要があります。
  6. 完了するよう登録されると、クライアントアプリケーションはWeb Services とやりとりを行いビジネスレベルの作業を遂行します。ビジネスのWeb サービスを呼び出すと毎回、クライアントは各呼出しが暗黙的にトランザクションによりスコープされているように、トランザクションコンテキストをSOAP ヘッダーブロックへ挿入します。WS-ATomic Transaction対応のWeb Services に対応するツールキットにより、SOAPヘッダブロックにあるコンテキストとバックエンド操作を相互に関連付けることができます。こうすることで、Web サービスが加えた変更がクライアントと同じトランザクションの範囲内で行われ、トランザクションコーディネータによるコミットあるいはロールバックの対象となるようにします。
  7. 必要とされるアプリケーションレベルの作業がすべて完了すると、クライアントは、サービスの状態を永続化する目的でトランザクションを終了することができます。完了パーティシパントは、コーディネータに対し、トランザクションのコミットあるいはロールバックを指示します。コミットあるいはロールバック操作が完了すると、状態はパーティシパントに返され、トランザクションの結果を示します。
完了プロトコルの説明は単純ですが、トランザクションを解決し結果を出すには他のパーティシパントプロトコルにも従う必要があります。
Volatile2pc
1つ目のプロトコルは、任意のVolatile2PC (2PCは2相コミットの略称)となっています。Volatile2PC プロトコルは、前述した同期プロトコルに相当するWS-Atomic Transaction です。通常、Web サービスがトランザクションのコミット前に揮発的な (キャッシュ) 状態をデータベースにフラッシュする必要がある場合に実行されます。これは通常アプリケーションのパフォーマンスを改善するために利用されています。フラッシュされると、2相対応のパーティシパントがこのデータを管理します。
完了パーティシパントがcommit操作を開始すると、prepare メッセージ経由でトランザクションがもうすぐ完了する旨をVolatile2PC パーティシパントに通知します。パーティシパントはpreparedabortedあるいは readonlyのメッセージ3つの内1つで返答することができます。この段階で失敗すると、トランザクションがロールバックされる原因になります。
Durable2PC
WS-Atomic Transactionの次のプロトコルは、Durable2PCで、Durable2PC プロトコルは、WS-Atomic Transaction の中核となっています。トランザクション内のパーティシパント間で必要なコンセンサスに持っていき、トランザクションが安全に終了できるようにします。
Durable2PC プロトコルはパーティシパント間のアトミック性 (atomicity) を確保し、従来の技術推定アボート機能を持つ2 相コミット (two-phase commit with presumed abort)に基づいています。

手順18.2 Durable2PC Procedure

  1. 1番目のフェーズでは、コーディネータがprepare メッセージを送信すると、パーティシパントはトランザクション中に発生する状態の変更を永続化する必要があります。こうすることでこれらの変更を後でロールバックするか、コミットすることができます。この時点ではアトミックトランザクションがロールバックする可能性があるため、元の状態情報を失うことはできません。パーティシパントがprepareできない場合、コーディネータにabortedメッセージで通知する必要があります。トランザクションは最終的にロールバックされます。また、パーティシパントがトランザクションのデータを何も変更しなかったサービスの対応をしている場合、readonlyメッセージを返し、コミットプロトコルの2番目のフェーズから省略されるようにすることが可能です。そうでない場合は、パーティシパントによりprepared メッセージが送信されます。
  2. 1番目のフェーズで問題が発生しない場合、Durable2PC は2番目のフェーズに進み、ここではコーディネータがcommit メッセージをパーティシパントに送信します。その後パーティシパントは、関連サービスが行った一時的な作業を永続化し、committed メッセージをコーディネータに送信します。問題が発生した場合、コーディネータが全パーティシパントにrollbackメッセージを送信し、関連サービスにより行われた作業を破棄し、この段階に到達していない場合はprepareで永続ストレージに保存された状態情報を削除します。パーティシパントはaborted メッセージをコーディネータに送信することでロールバックに対応します。

注記

WS-Atomic Transaction プロトコルのセマンティクスには、1相コミットの最適化は含まれていません。1つのパーティシパントしか参加していない場合も、完全な2相コミットが常に利用されます。
図18.6「WS-Atomic 2相パーティシパントの状態移行」では、WS-Atomic Transaction の状態移行、およびコーディネータとパーティシパント間のメッセージ交換について説明しています。コーディネータが生成したメッセージは実線で示され、パーティシパントのメッセージは点線を使います。
WS-Atomic 2相パーティシパントの状態移行

図18.6 WS-Atomic 2相パーティシパントの状態移行

Durable2PCプロトコルが完了すると、最初にトランザクションの終了を開始したCompletion プロトコルを完了でき、クライアントアプリケーションにトランザクションがコミットされたか、ロールバックされたか通知することができます。さらに、Volatile2PC プロトコルを完了することができます。
Volatile2PCのprepareフェーズのように、最後のフェーズは任意となっており、このフェーズを使いデータベース接続などリソースを開放できるように、パーティシパントにトランザクションの完了を通知可能です。
コーディネータにより、登録済みのVolatile2PC パーティシパントがトランザクション終了後に呼び出され、トランザクション完了の状態に関する通知を受けます。トランザクションが終了したため、この時点でパーティシパントに問題が発生しても結果に影響がないため無視されます。
個別のプロトコルが複雑に絡み合いAT全体を構成していますが、図18.7「」では、これらの個別プロトコルについて図解で説明しています。

図18.7