MySQL 伺服器實作了數個連線狀態追蹤器。用戶端可以啟用這些追蹤器來接收其連線狀態變更的通知。
連線狀態追蹤器具有如下用途
促進連線移轉。
促進交易切換。
追蹤器機制提供一種方法,讓 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
系統變數控制此追蹤器。追蹤敏感系統變數的值變更需要SENSITIVE_VARIABLES_OBSERVER
權限。可用的 GTID。
session_track_gtids
系統變數控制此追蹤器。關於交易狀態和特性的資訊。
session_track_transaction_info
系統變數控制此追蹤器。
有關追蹤器相關系統變數的說明,請參閱 第 7.1.8 節,「伺服器系統變數」。這些系統變數允許控制發生哪些變更通知,但不提供存取通知資訊的方法。通知發生在 MySQL 用戶端/伺服器協定中,該協定在 OK 封包中包含追蹤器資訊,以便可以偵測到連線狀態變更。
為了讓客戶端應用程式能夠從伺服器回傳的 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()。
$> 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
語句之前,執行了兩個 SET TRANSACTION
語句,設定下一個交易的隔離級別和存取模式特性。SESSION_TRACK_TRANSACTION_CHARACTERISTICS
值表示已設定的下一個交易值。
在結束交易的 COMMIT
語句之後,SESSION_TRACK_TRANSACTION_CHARACTERISTICS
值會回報為空。這表示在交易開始之前設定的下一個交易特性已重置,並且應用會話預設值。若要追蹤這些會話預設值的變更,請追蹤 transaction_isolation
和 transaction_read_only
系統變數的會話值。
若要查看有關 GTID 的資訊,請使用 session_track_gtids
系統變數啟用 SESSION_TRACK_GTIDS
追蹤器。