[UNIX、Linux、Windows、IBM i]

XA 動的登録

XA 仕様には、トランザクション・マネージャーがリソース・マネージャーに対して実行する xa_* 呼び出しの回数を減らす仕組みがあります。 この最適化の仕組みを動的登録 といいます。

動的登録は Db2®によってサポートされます。 他のデータベースでもサポートしているものがあります。詳しくは、ご使用のデータベース製品の資料を参照してください。

動的登録最適化はなぜ有用なのでしょうか。 アプリケーションには、データベース・テーブルの更新が含まれているグローバル作業単位もあれば、そのような更新が含まれていないグローバル作業単位もあります。 データベースのテーブルに対して永続的な更新が行われていない場合、MQCMIT 中に発生するコミット・プロトコルにそのデータベースを組み込む必要はありません。

データベースが動的登録をサポートしているかどうかに関係なく、アプリケーションは IBM® MQ 接続での最初の MQBEGIN 呼び出し時に xa_open を呼び出します。 アプリケーションは、後続の MQDISC 呼び出しで xa_close も呼び出します。 後続の XA 呼び出しのパターンは、データベースが動的登録をサポートしているかどうかによって異なります。
データベースが動的登録をサポートしない場合
すべてのグローバル作業単位には、作業単位内でそのデータベースのテーブルを永続的に更新したかどうかに関係なく、 IBM MQ コードによってデータベース・クライアント・ライブラリーに対して行われるいくつかの XA 関数呼び出しが含まれます。 以下が含まれます。
  • アプリケーション・プロセスからの xa_start および xa_end。 これらは、グローバル作業単位の始めと終わりを宣言するために使用されます。
  • キュー・マネージャー・エージェント・プロセス amqzlaa0 からの xa_preparexa_commit、および xa_rollback。 これらは、グローバル作業単位の結果、つまりコミットまたはロールバックの決定を送信するために使用されます。
さらに、キュー・マネージャー・エージェント・プロセスは、最初の MQBEGIN 中に xa_open も呼び出します。
データベースが動的登録をサポートする場合
IBM MQ コードは、必要な XA 関数呼び出しのみを行います。 データベース・リソースに対する永続的更新が伴わないグローバル作業単位の場合、データベースへの XA 呼び出しはありません。 そのような永続的更新が伴うグローバル作業単位の場合、次の呼び出しが行われます。
  • アプリケーション・プロセスからの、グローバル作業単位の終わりを宣言する xa_end
  • キュー・マネージャー・エージェント・プロセス amqzlaa0 からの xa_preparexa_commit、および xa_rollback。 これらは、グローバル作業単位の結果、つまりコミットまたはロールバックの決定を送信するために使用されます。

動的登録が機能するためには、データベースが現行のグローバル作業単位に組み込む永続更新をいつ実行したかを IBM MQ に通知する手段がデータベースにあることが不可欠です。 IBM MQ には、この目的のための ax_reg 関数が用意されています。

アプリケーション・プロセスで実行するデータベースのクライアント・コードは、ax_reg 関数を検出してそれを呼び出し、現行のグローバル作業単位内で永続的な作業を実行したという事実を動的に登録 します。 この ax_reg 呼び出しに応答して、 IBM MQ はデータベースが参加したことを記録します。 これがこの IBM MQ 接続での最初の ax_reg 呼び出しである場合、キュー・マネージャー・エージェント・プロセスは xa_openを呼び出します。

データベース・クライアント・コードは、プロセスで実行中に (例えば SQL UPDATE 呼び出し中や、データベースのクライアント API が関与するあらゆる呼び出し中に)、この ax_reg 呼び出しを実行します。