MySQL サーバーは、いくつかのセッション状態トラッカを実装します。 クライアントは、これらのトラッカがセッションステートに対する変更の通知を受信できるようにすることができます。
トラッカメカニズムの 1 つの用途は、MySQL コネクタおよびクライアントアプリケーションが、あるサーバーから別のサーバーへのセッション移行を許可するためにセッションコンテキストが使用可能かどうかを判断する手段を提供することです。 (ロードバランシングされた環境でセッションを変更するには、切替えが可能かどうかを判断する際に考慮する必要があるセッション状態があるかどうかを検出する必要があります。)
トラッカメカニズムの別の用途は、あるセッションから別のセッションにトランザクションを移動できるタイミングをアプリケーションが把握できるようにすることです。 トランザクション状態トラッキングにより、これが有効になります。これは、ビジー状態のサーバーから負荷の低いサーバーにトランザクションを移動するアプリケーションで役立ちます。 たとえば、クライアント接続プールを管理するロードバランシングコネクタは、プール内の使用可能なセッション間でトランザクションを移動できます。
ただし、セッション切替えは任意の時点では実行できません。 読取りまたは書込みが行われたトランザクションの途中にセッションがある場合、別のセッションに切り替えると、元のセッションでトランザクションがロールバックされます。 セッション切替えは、トランザクション内で読取りまたは書込みがまだ実行されていない場合にのみ実行する必要があります。
トランザクションを適切に切り替える場合の例を次に示します:
START TRANSACTION
の直後COMMIT AND CHAIN
の後
トランザクションの状態を把握するだけでなく、トランザクションが別のセッションに移動された場合にも同じ特性を使用できるように、トランザクションの特性を把握しておくと役立ちます。 この目的に関連する特性は次のとおりです:
READ ONLY
READ WRITE
ISOLATION LEVEL
WITH CONSISTENT SNAPSHOT
前述のセッション切替えアクティビティをサポートするために、次のタイプのクライアントセッション状態情報の通知を使用できます:
-
クライアントセッションステートの次の属性に対する変更:
デフォルトスキーマ (データベース)。
システム変数のセッション固有の値。
ユーザー定義変数。
一時テーブル
プリペアドステートメント。
session_track_state_change
システム変数は、このトラッカを制御します。 デフォルトのスキーマ名への変更。
session_track_schema
システム変数は、このトラッカを制御します。システム変数のセッション値の変更。
session_track_system_variables
システム変数は、このトラッカを制御します。使用可能 GTID。
session_track_gtids
システム変数は、このトラッカを制御します。トランザクションの状態と特性に関する情報。
session_track_transaction_info
システム変数は、このトラッカを制御します。
トラッカ関連のシステム変数の詳細は、セクション5.1.8「サーバーシステム変数」 を参照してください。 これらのシステム変数は、発生する変更通知を制御できますが、通知情報にアクセスする方法は提供しません。 通知は、セッション状態の変更を検出できるように OK パケットにトラッカ情報を含む MySQL クライアント/サーバープロトコルで発生します。 クライアントアプリケーションがサーバーから返された OK パケットから状態変更情報を抽出できるようにするために、MySQL C API には次の関数のペアが用意されています:
mysql_session_track_get_first()
は、サーバーから受信した状態変更情報の最初の部分をフェッチします。 mysql_session_track_get_first()を参照してください。mysql_session_track_get_next()
は、サーバーから受信した残りの状態変更情報をフェッチします。mysql_session_track_get_first()
が正常にコールされた後、成功を返すかぎり、この関数を繰り返しコールします。 mysql_session_track_get_next()を参照してください。
mysqltest プログラムには、セッショントラッカ通知が発生するかどうかを制御する disable_session_track_info
および enable_session_track_info
コマンドがあります。 これらのコマンドを使用して、SQL ステートメントによって生成される通知をコマンドラインから確認できます。 ファイル testscript
に次の mysqltest スクリプトが含まれているとします:
DROP TABLE IF EXISTS test.t1;
CREATE TABLE test.t1 (i INT, f FLOAT);
--enable_session_track_info
SET @@SESSION.session_track_schema=ON;
SET @@SESSION.session_track_system_variables='*';
SET @@SESSION.session_track_state_change=ON;
USE information_schema;
SET NAMES 'utf8mb4';
SET @@SESSION.session_track_transaction_info='CHARACTERISTICS';
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET TRANSACTION READ WRITE;
START TRANSACTION;
SELECT 1;
INSERT INTO test.t1 () VALUES();
INSERT INTO test.t1 () VALUES(1, RAND());
COMMIT;
次のようにスクリプトを実行して、有効なトラッカによって提供される情報を確認します。 様々なトラッカについて mysqltest によって表示される Tracker:
情報の詳細は、mysql_session_track_get_first() を参照してください。
shell> mysqltest < testscript
DROP TABLE IF EXISTS test.t1;
CREATE TABLE test.t1 (i INT, f FLOAT);
SET @@SESSION.session_track_schema=ON;
SET @@SESSION.session_track_system_variables='*';
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
-- session_track_system_variables
-- *
SET @@SESSION.session_track_state_change=ON;
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
-- session_track_state_change
-- ON
USE information_schema;
-- Tracker : SESSION_TRACK_SCHEMA
-- information_schema
-- Tracker : SESSION_TRACK_STATE_CHANGE
-- 1
SET NAMES 'utf8mb4';
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
-- character_set_client
-- utf8mb4
-- character_set_connection
-- utf8mb4
-- character_set_results
-- utf8mb4
-- Tracker : SESSION_TRACK_STATE_CHANGE
-- 1
SET @@SESSION.session_track_transaction_info='CHARACTERISTICS';
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
-- session_track_transaction_info
-- CHARACTERISTICS
-- Tracker : SESSION_TRACK_STATE_CHANGE
-- 1
-- Tracker : SESSION_TRACK_TRANSACTION_CHARACTERISTICS
--
-- Tracker : SESSION_TRACK_TRANSACTION_STATE
-- ________
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
-- Tracker : SESSION_TRACK_TRANSACTION_CHARACTERISTICS
-- SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET TRANSACTION READ WRITE;
-- Tracker : SESSION_TRACK_TRANSACTION_CHARACTERISTICS
-- SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; SET TRANSACTION READ WRITE;
START TRANSACTION;
-- Tracker : SESSION_TRACK_TRANSACTION_CHARACTERISTICS
-- SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; START TRANSACTION READ WRITE;
-- Tracker : SESSION_TRACK_TRANSACTION_STATE
-- T_______
SELECT 1;
1
1
-- Tracker : SESSION_TRACK_TRANSACTION_STATE
-- T_____S_
INSERT INTO test.t1 () VALUES();
-- Tracker : SESSION_TRACK_TRANSACTION_STATE
-- T___W_S_
INSERT INTO test.t1 () VALUES(1, RAND());
-- Tracker : SESSION_TRACK_TRANSACTION_STATE
-- T___WsS_
COMMIT;
-- Tracker : SESSION_TRACK_TRANSACTION_CHARACTERISTICS
--
-- Tracker : SESSION_TRACK_TRANSACTION_STATE
-- ________
ok
START TRANSACTION
ステートメントの前に、次のトランザクションの分離レベルおよびアクセスモード特性を設定する 2 つの SET TRANSACTION
ステートメントが実行されます。 SESSION_TRACK_TRANSACTION_CHARACTERISTICS
値は、次に設定されたトランザクション値を示します。
トランザクションを終了する COMMIT
ステートメントに続いて、SESSION_TRACK_TRANSACTION_CHARACTERISTICS
値が空として報告されます。 これは、トランザクションの開始前に設定された次のトランザクション特性がリセットされ、セッションのデフォルトが適用されることを示します。 これらのセッションデフォルトに対する変更を追跡するには、transaction_isolation
および transaction_read_only
システム変数のセッション値を追跡します。