MySQL で XA トランザクションを実行するには、次のステートメントを使用します。
XA {START|BEGIN} xid [JOIN|RESUME]
XA END xid [SUSPEND [FOR MIGRATE]]
XA PREPARE xid
XA COMMIT xid [ONE PHASE]
XA ROLLBACK xid
XA RECOVER [CONVERT XID]
XA START
の場合、JOIN
句および RESUME
句は認識されますが、効果はありません。
XA END
の場合、SUSPEND [FOR MIGRATE]
句は認識されますが、効果はありません。
各 XA ステートメントは XA
キーワードで始まり、そのほとんどに xid
値が必要です。 xid
は XA トランザクション識別子です。 これは、このステートメントがどのトランザクションに適用されるかを示します。xid
値はクライアントによって指定されるか、または MySQL サーバーによって生成されます。 xid
値には、1 つから 3 つの部分が含まれています。
xid: gtrid [, bqual [, formatID ]]
gtrid
はグローバルトランザクション識別子であり、bqual
はブランチ修飾子であり、formatID
は、gtrid
および bqual
値で使用される形式を識別する数値です。 構文で示されているように、bqual
と formatID
はオプションです。 bqual
が指定されていない場合、そのデフォルト値は ''
です。 formatID
が指定されていない場合、そのデフォルト値は 1 です。
gtrid
と bqual
はそれぞれ、最大 64 バイト長 (64 文字ではありません) の文字列リテラルである必要があります。gtrid
と bqual
は、いくつかの方法で指定できます。 引用符付き文字列 ('ab'
)、16 進文字列 (X'6162'
、0x6162
) またはビット値 (b'
) を使用できます。
nnnn
'
formatID
は符号なし整数です。
gtrid
および bqual
値は、MySQL サーバーのベースとなる XA サポートルーチンによってバイト単位で解釈されます。 ただし、XA ステートメントを含む SQL ステートメントが解析されている間、サーバーは何からの特定の文字セットで動作します。 安全のために、gtrid
と bqual
は 16 進文字列として記述してください。
xid
値は通常、トランザクションマネージャーによって生成されます。 ある TM によって生成される値は、ほかの TM によって生成される値とは異なっている必要があります。 特定の TM は、XA RECOVER
ステートメントによって返された値のリスト内の自身の xid
値を認識できる必要があります。
XA START
は、指定された xid
xid
値を使用して XA トランザクションを開始します。 各 XA トランザクションが一意の xid
値を持っている必要があるため、その値が現在、別の XA トランザクションによって使用されていてはいけません。 一意性は、gtrid
および bqual
値を使用して評価されます。 XA トランザクションに対する以降のすべての XA ステートメントを、XA START
ステートメントで指定されたものと同じ xid
値を使用して指定する必要があります。 これらのステートメントのいずれかを使用しているが、既存の XA トランザクションに対応していない xid
値を指定した場合は、エラーが発生します。
1 つ以上の XA トランザクションを同じグローバルトランザクションの一部にすることができます。 特定のグローバルトランザクション内のすべての XA トランザクションが xid
値内の同じ gtrid
値を使用する必要があります。 このため、特定の XA トランザクションがどのグローバルトランザクションの一部であるかについてのあいまいさがないように、gtrid
値はグローバルに一意である必要があります。 xid
値の bqual
部分は、グローバルトランザクション内の XA トランザクションごとに異なっている必要があります。 (bqual
値が異なっているという要件は、現在の MySQL XA 実装の制限です。 これは XA 仕様の一部ではありません。)
XA RECOVER
ステートメントは、PREPARED
状態にある MySQL サーバー上の XA トランザクションに関する情報を返します。 (セクション13.3.8.2「XA トランザクションの状態」を参照してください。) この出力には、どのクライアントによって開始されたかには関係なく、サーバー上のこのような XA トランザクションごとの行が含まれています。
XA RECOVER
には、XA_RECOVER_ADMIN
権限が必要です。 この権限要件により、ユーザーは自分以外の未処理の準備済 XA トランザクションの XID 値を検出できなくなります。 XA トランザクションを開始したユーザーが XID を認識しているため、XA トランザクションの通常のコミットまたはロールバックには影響しません。
XA RECOVER
の出力行は次のようになります ('abc'
、'def'
、7
の各部分から成る xid
値の例の場合)。
mysql> XA RECOVER;
+----------+--------------+--------------+--------+
| formatID | gtrid_length | bqual_length | data |
+----------+--------------+--------------+--------+
| 7 | 3 | 3 | abcdef |
+----------+--------------+--------------+--------+
出力カラムには次の意味があります。
formatID
は、トランザクションxid
のformatID
部分です。gtrid_length
は、xid
のgtrid
部分の長さ (バイト単位) です。bqual_length
は、xid
のbqual
部分の長さ (バイト単位) です。data
は、xid
のgtrid
およびbqual
部分の連結です。
XID 値に印刷不可能な文字が含まれる場合があります。 XA RECOVER
では、クライアントが XID 値を 16 進数でリクエストできるように、オプションの CONVERT XID
句を使用できます。