パフォーマンススキーマはトランザクションを計測します。 イベント階層内では、待機イベントはステージイベント内にネストされ、ステージイベントはステートメントイベント内にネストされ、ステートメントイベントはトランザクションイベント内にネストされます。
次のテーブルには、トランザクションイベントが格納されます:
events_transactions_current
: 各スレッドの現在のトランザクションイベント。events_transactions_history
: スレッドごとに終了した最新のトランザクションイベント。events_transactions_history_long
: グローバルに (すべてのスレッドで) 終了した最新のトランザクションイベント。
次の各セクションでは、トランザクションイベントテーブルについて説明します。 トランザクションイベントに関する情報を集計するサマリーテーブルもあります。セクション27.12.18.5「トランザクション要約テーブル」 を参照してください。
3 つのトランザクションイベントテーブル間の関係の詳細は、セクション27.9「現在および過去のイベントのパフォーマンススキーマテーブル」 を参照してください。
トランザクションイベント収集の構成
トランザクションイベントを収集するかどうかを制御するには、関連するインストゥルメントおよびコンシューマの状態を設定します:
setup_instruments
テーブルには、transaction
という名前のインストゥルメントが含まれています。 このインストゥルメントを使用して、個々のトランザクションイベントクラスの収集を有効または無効にします。setup_consumers
テーブルには、現在のトランザクションイベントテーブル名と履歴トランザクションイベントテーブル名に対応する名前のコンシューマ値が含まれます。 これらのコンシューマを使用して、トランザクションイベントのコレクションをフィルタします。
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
ファイルで次のような行を使用します:
-
有効化:
[mysqld] performance-schema-instrument='transaction=ON' performance-schema-consumer-events-transactions-current=ON performance-schema-consumer-events-transactions-history=ON performance-schema-consumer-events-transactions-history-long=ON
-
無効化:
[mysqld] performance-schema-instrument='transaction=OFF' performance-schema-consumer-events-transactions-current=OFF performance-schema-consumer-events-transactions-history=OFF performance-schema-consumer-events-transactions-history-long=OFF
実行時にトランザクションイベント収集を制御するには、setup_instruments
テーブルと setup_consumers
テーブルを更新します:
-
有効化:
UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES' WHERE NAME = 'transaction'; UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE 'events_transactions%';
-
無効化:
UPDATE performance_schema.setup_instruments SET ENABLED = 'NO', TIMED = 'NO' WHERE NAME = 'transaction'; UPDATE performance_schema.setup_consumers SET ENABLED = 'NO' WHERE NAME LIKE 'events_transactions%';
特定のトランザクションイベントテーブルに対してのみトランザクションイベントを収集するには、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
への参照は BEGIN
、XA START
および XA BEGIN
にも適用されます。 同様に、COMMIT
および ROLLBACK
への参照は、それぞれ XA COMMIT
および XA ROLLBACK
に適用されます。
パフォーマンススキーマは、サーバーと同様のトランザクション境界を定義します。 トランザクションイベントの開始と終了は、サーバー内の対応する状態遷移と密接に一致します:
明示的に開始されたトランザクションの場合、トランザクションイベントは
START TRANSACTION
ステートメントの処理中に開始されます。暗黙的に開始されたトランザクションの場合、トランザクションイベントは、前のトランザクションの終了後にトランザクションエンジンを使用する最初のステートメントで開始されます。
トランザクションについては、明示的に終了したか暗黙的に終了したかにかかわらず、
COMMIT
またはROLLBACK
の処理中にサーバーがアクティブなトランザクション状態から遷移すると、トランザクションイベントが終了します。
このアプローチには微妙な影響があります:
パフォーマンススキーマ内のトランザクションイベントには、対応する
START TRANSACTION
、COMMIT
、またはROLLBACK
ステートメントに関連付けられたステートメントイベントが完全には含まれていません。 トランザクションイベントとこれらのステートメントの間には、わずかなタイミングの重複があります。非トランザクションエンジンで動作するステートメントは、接続のトランザクション状態には影響しません。 暗黙的トランザクションの場合、トランザクションイベントはトランザクションエンジンを使用する最初のステートメントから始まります。 つまり、非トランザクションテーブルで排他的に動作するステートメントは、
START TRANSACTION
に続く場合でも無視されます。
説明するために、次のシナリオを考えてみます:
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 つの属性で定義されます:
アクセスモード (読取り専用、読取り/書込み)
分離レベル (
SERIALIZABLE
、REPEATABLE READ
など)暗黙 (
autocommit
が有効) または明示 (autocommit
が無効)
トランザクションインストゥルメンテーションの複雑さを軽減し、収集されたトランザクションデータが完全で意味のある結果を提供するようにするために、すべてのトランザクションはアクセスモード、分離レベルまたは自動コミットモードとは無関係にインストゥルメントされます。
トランザクション履歴を選択的に調べるには、トランザクションイベントテーブルの属性カラムを使用: ACCESS_MODE
、ISOLATION_LEVEL
および AUTOCOMMIT
。
トランザクションインストゥルメンテーションのコストは、ユーザー、アカウント、ホストまたはスレッド (クライアント接続) に応じたトランザクションインストゥルメンテーションの有効化または無効化など、様々な方法で削減できます。
トランザクションおよびネストされたイベント
トランザクションイベントの親は、トランザクションを開始したイベントです。 明示的に開始されたトランザクションの場合、これには START TRANSACTION
および COMMIT AND CHAIN
ステートメントが含まれます。 暗黙的に開始されたトランザクションの場合は、前のトランザクションの終了後にトランザクションエンジンを使用する最初のステートメントです。
一般に、トランザクションは、COMMIT
や ROLLBACK
などのトランザクションを明示的に終了するステートメントを含め、トランザクション中に開始されるすべてのイベントの最上位レベルの親です。 例外は、DDL ステートメントなど、トランザクションを暗黙的に終了するステートメントです。この場合、新しいステートメントを実行する前に現在のトランザクションをコミットする必要があります。
トランザクションとストアドプログラム
トランザクションおよびストアドプログラムイベントは、次のように関連付けられます:
-
ストアドプロシージャ
ストアドプロシージャは、トランザクションとは無関係に動作します。 ストアドプロシージャはトランザクション内で開始でき、トランザクションはストアドプロシージャ内から開始または終了できます。 ストアドプロシージャは、トランザクション内からコールされた場合、親トランザクションのコミットを強制するステートメントを実行し、新しいトランザクションを開始できます。
ストアドプロシージャがトランザクション内で開始された場合、そのトランザクションはストアドプロシージャイベントの親になります。
ストアドプロシージャによってトランザクションが開始された場合、ストアドプロシージャはトランザクションイベントの親です。
-
ストアドファンクション
ストアドファンクションは、明示的または暗黙的なコミットまたはロールバックの原因に制限されています。 ストアドファンクションイベントは、親トランザクションイベント内に存在できます。
-
トリガー
トリガーは、関連付けられているテーブルにアクセスするステートメントの一部としてアクティブ化されるため、トリガーイベントの親は常に、トリガーイベントをアクティブ化するステートメントです。
トリガーは、トランザクションを明示的または暗黙的にコミットまたはロールバックするステートメントを発行できません。
-
予定イベント
スケジュール済みイベントの本文でのステートメントの実行は、新しい接続で行われます。 親トランザクション内でのスケジュール済イベントのネストは適用できません。
トランザクションとセーブポイント
セーブポイントステートメントは、個別のステートメントイベントとして記録されます。 トランザクションイベントには、トランザクション中に発行された SAVEPOINT
、ROLLBACK TO SAVEPOINT
および RELEASE SAVEPOINT
ステートメントの個別のカウンタが含まれます。
トランザクションおよびエラー
トランザクション内で発生したエラーおよび警告は、ステートメントイベントに記録されますが、対応するトランザクションイベントには記録されません。 これには、非トランザクションテーブルでのロールバックや GTID 整合性エラーなど、トランザクション固有のエラーおよび警告が含まれます。