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
跟踪器。