MySQL 8.0 リファレンスマニュアル MySQL NDB Cluster 8.0 を含む

このページは機械翻訳したものです。

13.3.8.3 XA トランザクションの制約

XA トランザクションのサポートは、InnoDB ストレージエンジンに限られています。

外部 XA の場合、MySQL Server がリソースマネージャーとして機能し、クライアントプログラムがトランザクションマネージャーとして機能します。 内部 XA の場合、MySQL サーバー内のストレージエンジンがリソースマネージャーとして機能し、サーバー自体がトランザクションマネージャーとして機能します。 内部 XA サポートは、個々のストレージエンジンの機能によって制限されています。 内部 XA は、複数のストレージエンジンが関与する XA トランザクションを処理するために必要になります。 内部 XA の実装では、ストレージエンジンがテーブルハンドラレベルでの 2 フェーズコミットをサポートしている必要であり、現在これは InnoDB にのみ当てはまります。

XA START の場合、JOIN 句および RESUME 句は認識されますが、効果はありません。

XA END の場合、SUSPEND [FOR MIGRATE]句は認識されますが、効果はありません。

xid 値の bqual 部分が、グローバルトランザクション内の XA トランザクションごとに異なる必要があるという要件が、現在の MySQL XA 実装の制限です。 これは XA の仕様によるものではありません。

XA トランザクションは、2 つの部分でバイナリログに書き込まれます。 XA PREPARE が発行されると、XA PREPARE までのトランザクションの最初の部分が初期 GTID を使用して書き込まれます。 XA_prepare_log_event は、バイナリログ内のこのようなトランザクションを識別するために使用されます。 XA COMMIT または XA ROLLBACK が発行されると、XA COMMIT または XA ROLLBACK ステートメントのみを含むトランザクションの別の部分が、別の GTID を使用して書き込まれます。 XA_prepare_log_event で識別されるトランザクションの最初の部分の後に、必ずしも XA COMMIT または XA ROLLBACK が続くわけではありません。これにより、任意の 2 つの XA トランザクションのインターリーブバイナリロギングが発生する可能性があります。 XA トランザクションの 2 つの部分は、異なるバイナリログファイルでも使用できます。 つまり、PREPARED 状態の XA トランザクションは、明示的な XA COMMIT ステートメントまたは XA ROLLBACK ステートメントが発行されるまで永続的になり、XA トランザクションがレプリケーションと互換性を持つようになります。

レプリカでは、XA トランザクションが準備されるとすぐにレプリケーションアプライヤスレッドからデタッチされ、レプリカ上の任意のスレッドによってコミットまたはロールバックできます。 これは、同じ XA トランザクションが、異なるスレッド上の異なる状態で events_transactions_current テーブルに表示されることを意味します。 events_transactions_current テーブルには、スレッド上の最新の監視対象トランザクションイベントの現在のステータスが表示され、スレッドがアイドル状態の場合、このステータスは更新されません。 そのため、XA トランザクションは、別のスレッドによって処理された後も、元のアプライヤスレッドの PREPARED 状態で表示できます。 PREPARED 状態のままでリカバリが必要な XA トランザクションを肯定的に識別するには、パフォーマンススキーマトランザクションテーブルではなく、XA RECOVER ステートメントを使用します。

XA トランザクションの使用には、次の制限があります:

注記

MySQL 5.7.7 より前は、XA トランザクションはレプリケーションとまったく互換性がありませんでした。 これは、PREPARED 状態の XA トランザクションが、サーバーのクリーンシャットダウンまたはクライアントの切断時にロールバックされるためです。 同様に、サーバーが異常停止してから再度起動されたが、トランザクションの内容をバイナリログに書き込めなかった場合、PREPARED 状態の XA トランザクションは PREPARED 状態のままになります。 どちらの状況でも、XA トランザクションを正しくレプリケートできませんでした。