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

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

27.12.7 パフォーマンススキーマのトランザクションテーブル

パフォーマンススキーマはトランザクションを計測します。 イベント階層内では、待機イベントはステージイベント内にネストされ、ステージイベントはステートメントイベント内にネストされ、ステートメントイベントはトランザクションイベント内にネストされます。

次のテーブルには、トランザクションイベントが格納されます:

次の各セクションでは、トランザクションイベントテーブルについて説明します。 トランザクションイベントに関する情報を集計するサマリーテーブルもあります。セクション27.12.18.5「トランザクション要約テーブル」 を参照してください。

3 つのトランザクションイベントテーブル間の関係の詳細は、セクション27.9「現在および過去のイベントのパフォーマンススキーマテーブル」 を参照してください。

トランザクションイベント収集の構成

トランザクションイベントを収集するかどうかを制御するには、関連するインストゥルメントおよびコンシューマの状態を設定します:

transaction インストゥルメント、events_transactions_current および events_transactions_history トランザクションコンシューマは、デフォルトで有効になっています:

mysql> SELECT NAME, ENABLED, TIMED
       FROM performance_schema.setup_instruments
       WHERE NAME = 'transaction';
+-------------+---------+-------+
| NAME        | ENABLED | TIMED |
+-------------+---------+-------+
| transaction | YES     | YES   |
+-------------+---------+-------+
mysql> SELECT *
       FROM performance_schema.setup_consumers
       WHERE NAME LIKE 'events_transactions%';
+----------------------------------+---------+
| NAME                             | ENABLED |
+----------------------------------+---------+
| events_transactions_current      | YES     |
| events_transactions_history      | YES     |
| events_transactions_history_long | NO      |
+----------------------------------+---------+

サーバー起動時のトランザクションイベント収集を制御するには、my.cnf ファイルで次のような行を使用します:

実行時にトランザクションイベント収集を制御するには、setup_instruments テーブルと setup_consumers テーブルを更新します:

特定のトランザクションイベントテーブルに対してのみトランザクションイベントを収集するには、transaction インストゥルメントを有効にしますが、目的のテーブルに対応するトランザクションコンシューマのみを有効にします。

イベント収集の構成の詳細は、セクション27.3「パフォーマンススキーマ起動構成」 および セクション27.4「パフォーマンススキーマ実行時構成」 を参照してください。

トランザクション境界

MySQL Server では、トランザクションは次のステートメントで明示的に開始されます:

START TRANSACTION | BEGIN | XA START | XA BEGIN

トランザクションも暗黙的に開始されます。 たとえば、autocommit システム変数が有効になっている場合、各ステートメントの開始によって新しいトランザクションが開始されます。

autocommit が無効になっている場合、コミットされたトランザクションに続く最初のステートメントによって、新しいトランザクションの開始がマークされます。 後続のステートメントは、コミットされるまでトランザクションの一部です。

トランザクションは、次のステートメントで明示的に終了します:

COMMIT | ROLLBACK | XA COMMIT | XA ROLLBACK

トランザクションは、DDL ステートメント、ロックステートメントおよびサーバー管理ステートメントの実行によっても暗黙的に終了します。

次の説明では、START TRANSACTION への参照は BEGINXA START および XA BEGIN にも適用されます。 同様に、COMMIT および ROLLBACK への参照は、それぞれ XA COMMIT および XA ROLLBACK に適用されます。

パフォーマンススキーマは、サーバーと同様のトランザクション境界を定義します。 トランザクションイベントの開始と終了は、サーバー内の対応する状態遷移と密接に一致します:

このアプローチには微妙な影響があります:

説明するために、次のシナリオを考えてみます:

1. SET autocommit = OFF;
2. CREATE TABLE t1 (a INT) ENGINE = InnoDB;
3. START TRANSACTION;                       -- Transaction 1 START
4. INSERT INTO t1 VALUES (1), (2), (3);
5. CREATE TABLE t2 (a INT) ENGINE = MyISAM; -- Transaction 1 COMMIT
                                            -- (implicit; DDL forces commit)
6. INSERT INTO t2 VALUES (1), (2), (3);     -- Update nontransactional table
7. UPDATE t2 SET a = a + 1;                 -- ... and again
8. INSERT INTO t1 VALUES (4), (5), (6);     -- Write to transactional table
                                            -- Transaction 2 START (implicit)
9. COMMIT;                                  -- Transaction 2 COMMIT

サーバーの観点からは、トランザクション 1 はテーブル t2 が作成されると終了します。 トランザクション 2 は、非トランザクションテーブルへの更新が介在しているにもかかわらず、トランザクションテーブルにアクセスするまで開始されません。

パフォーマンススキーマの観点からは、サーバーがアクティブなトランザクション状態に遷移すると、トランザクション 2 が開始されます。 ステートメント 6 および 7 はトランザクション 2 の境界内に含まれません。これは、サーバーがバイナリログにトランザクションを書き込む方法と一致します。

トランザクション手段

トランザクションは、次の 3 つの属性で定義されます:

トランザクションインストゥルメンテーションの複雑さを軽減し、収集されたトランザクションデータが完全で意味のある結果を提供するようにするために、すべてのトランザクションはアクセスモード、分離レベルまたは自動コミットモードとは無関係にインストゥルメントされます。

トランザクション履歴を選択的に調べるには、トランザクションイベントテーブルの属性カラムを使用: ACCESS_MODEISOLATION_LEVEL および AUTOCOMMIT

トランザクションインストゥルメンテーションのコストは、ユーザー、アカウント、ホストまたはスレッド (クライアント接続) に応じたトランザクションインストゥルメンテーションの有効化または無効化など、様々な方法で削減できます。

トランザクションおよびネストされたイベント

トランザクションイベントの親は、トランザクションを開始したイベントです。 明示的に開始されたトランザクションの場合、これには START TRANSACTION および COMMIT AND CHAIN ステートメントが含まれます。 暗黙的に開始されたトランザクションの場合は、前のトランザクションの終了後にトランザクションエンジンを使用する最初のステートメントです。

一般に、トランザクションは、COMMITROLLBACK などのトランザクションを明示的に終了するステートメントを含め、トランザクション中に開始されるすべてのイベントの最上位レベルの親です。 例外は、DDL ステートメントなど、トランザクションを暗黙的に終了するステートメントです。この場合、新しいステートメントを実行する前に現在のトランザクションをコミットする必要があります。

トランザクションとストアドプログラム

トランザクションおよびストアドプログラムイベントは、次のように関連付けられます:

トランザクションとセーブポイント

セーブポイントステートメントは、個別のステートメントイベントとして記録されます。 トランザクションイベントには、トランザクション中に発行された SAVEPOINTROLLBACK TO SAVEPOINT および RELEASE SAVEPOINT ステートメントの個別のカウンタが含まれます。

トランザクションおよびエラー

トランザクション内で発生したエラーおよび警告は、ステートメントイベントに記録されますが、対応するトランザクションイベントには記録されません。 これには、非トランザクションテーブルでのロールバックや GTID 整合性エラーなど、トランザクション固有のエラーおよび警告が含まれます。