文档主页
MySQL 9.0 参考手册
相关文档 下载本手册

MySQL 9.0 参考手册  /  ...  /  服务器对客户端会话状态的跟踪

7.1.18 服务器对客户端会话状态的跟踪

MySQL 服务器实现了多个会话状态跟踪器。客户端可以启用这些跟踪器以接收其会话状态更改的通知。

会话状态跟踪器的用途

会话状态跟踪器具有以下用途

  • 促进会话迁移。

  • 促进事务切换。

跟踪器机制为 MySQL 连接器和客户端应用程序提供了一种方法,以确定是否有任何会话上下文可用于允许从一个服务器到另一个服务器的会话迁移。(要在负载均衡环境中更改会话,需要检测是否有会话状态需要考虑,以便决定是否可以进行切换。)

跟踪器机制允许应用程序知道何时可以将事务从一个会话移动到另一个会话。事务状态跟踪实现了这一点,这对于可能希望将事务从繁忙服务器移动到负载较轻的服务器的应用程序很有用。例如,管理客户端连接池的负载均衡连接器可以在池中的可用会话之间移动事务。

但是,会话切换不能在任意时间进行。如果会话处于已执行读取或写入的事务中间,则切换到其他会话意味着在原始会话上进行事务回滚。只有当事务尚未在其内执行任何读取或写入操作时,才必须进行会话切换。

事务可能合理切换的示例

除了了解事务状态之外,了解事务特征也很有用,以便在将事务移动到其他会话时使用相同的特征。以下特征与此目的相关

READ ONLY
READ WRITE
ISOLATION LEVEL
WITH CONSISTENT SNAPSHOT

可用的会话状态跟踪器

为了支持会话跟踪活动,以下类型的客户端会话状态信息提供通知

有关跟踪器相关系统变量的描述,请参见 第 7.1.8 节“服务器系统变量”。这些系统变量允许控制发生哪些更改通知,但不提供访问通知信息的方法。通知发生在 MySQL 客户端/服务器协议中,该协议在 OK 数据包中包含跟踪器信息,以便可以检测会话状态更改。

C API 会话状态跟踪器支持

为了使客户端应用程序能够从服务器返回的 OK 数据包中提取状态更改信息,MySQL C API 提供了一对函数

测试套件会话状态跟踪器支持

mysqltest 程序具有 disable_session_track_infoenable_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_isolationtransaction_read_only 系统变量的会话值。

要查看有关 GTID 的信息,请使用 session_track_gtids 系统变量启用 SESSION_TRACK_GTIDS 跟踪器。