13.1.1 シナリオ: 一定金額の引出しおよび預入れ

次のステップでは、サンプル・アプリケーションを実行するときの、XAトランザクションの正常なパスのシーケンス例を示します。ここでは、部門1から一定金額を引き出して、その金額を部門2に預け入れするようにユーザーがリクエストするシナリオについて考えてみます。エラー時には、起動側アプリケーションがコミットのかわりにロールバックをコールします。

部門1と部門2はXA準拠のリソース・マネージャを使用すると仮定します。
  1. ユーザーが、部門1から部門2に一定金額を送金するリクエストを行います。
  2. ユーザーが部門1からの一定金額の引出しをリクエストすると、振込サービスがトランザクションを開始します。トランザクション・イニシエータ・サービスである振込は、XAトランザクションを開始するためにMicroTxをコールします。

    MicroTxは、トランザクションを追跡するための新しいグローバル・トランザクションID (GTRID)を作成し、GTRIDをデータ・ストアに書き込み、GTRIDをトランザクション・イニシエータ・サービスに返します。

  3. 振込が、一定金額を引き出すリクエストを部門1に送信します。
  4. トランザクション参加側サービスである部門1は、同じGTRIDを使用してMicroTxに登録します。トランザクションを正常に完了するには、MicroTxが複数の参加側サービスと対話する必要がある場合があります。MicroTxは、各参加側サービスに一意のブランチIDも作成します。XIDにはGTRIDとブランチIDの両方が含まれているため、XIDは参加側サービスごとに一意です。
  5. XAプロトコルでは、MicroTxが、参加側マイクロサービス(部門1など)とリソース・マネージャの間の通信を管理します。部門1は、MicroTxクライアント・ライブラリを使用する必要があります。これが、コールバックを登録して、リソース・マネージャのためにコールバックの実装を提供します。
  6. 部門1がDML操作を実行して一定金額を引き出し、レスポンスを返します。
  7. 振込サービスは、一定金額を部門2に預け入れする別のリクエストを開始します。
  8. トランザクション参加側サービスである部門2は、同じGTRIDを使用してMicroTxに登録します。MicroTxコーディネータは、部門2に固有のブランチIDを作成します。
  9. 部門2が、統合されたMicroTxライブラリを使用してリソース・マネージャと通信します。
  10. 部門2がDML操作を実行して一定金額を預け入れ、レスポンスを返します。
  11. 振込サービスがトランザクションをコミットするのは、部門1へのリクエストと部門2へのリクエストの両方が正常に実行された場合のみです。何らかのエラーが発生すると、振込サービスはコミットではなくロールバックをコールします。振込は、部門1と部門2によって使用されたのと同じGTRIDを使用してトランザクションをコミットします。
  12. MicroTxコーディネータは、参加側サービスである部門1がトランザクションをコミットするための準備を行います。
  13. MicroTxコーディネータが部門1をコールします。これに対して、参加側マイクロサービスは、統合されたMicroTxライブラリを使用して、リソース・マネージャを準備するリクエストを送信します。
  14. MicroTxコーディネータは、参加側サービスである部門2がトランザクションをコミットするための準備を行います。
  15. コーディネータが部門2にリクエストを送信します。これに対して、参加側マイクロサービスは、統合されたMicroTxライブラリを使用して、リソース・マネージャを準備するリクエストを送信します。
  16. 準備フェーズが正常に完了すると、コーディネータが参加側にコミット・リクエストを送信します。これに対して、参加側サービス2が、統合されたMicroTxライブラリを使用してリソース・マネージャにリクエストを送信します。コーディネータがレスポンスを振込サービスに返し、トランザクションが完了します。