MySQL 服务器实现了几个会话状态跟踪器。客户端可以启用这些跟踪器以接收其会话状态更改的通知。The MySQL server implements several session state trackers. A client can enable these trackers to receive notification of changes to its session state.
会话状态跟踪器具有如下用途:Session state trackers have uses such as these:
用于促进会话迁移。To facilitate session migration.
用于促进事务切换。To facilitate transaction switching.
跟踪器机制为 MySQL 连接器和客户端应用程序提供了一种方法,以确定是否有任何会话上下文可用,从而允许会话从一个服务器迁移到另一个服务器。(在负载均衡环境中更改会话时,需要检测是否存在会话状态,以便在决定是否可以进行切换时加以考虑。)The tracker mechanism provides a means for MySQL connectors and client applications to determine whether any session context is available to permit session migration from one server to another. (To change sessions in a load-balanced environment, it is necessary to detect whether there is session state to take into consideration when deciding whether a switch can be made.)
跟踪器机制允许应用程序知道事务何时可以从一个会话移动到另一个会话。事务状态跟踪实现了这一点,这对于希望将事务从繁忙服务器移动到负载较轻的服务器的应用程序非常有用。例如,管理客户端连接池的负载均衡连接器可以在池中的可用会话之间移动事务。The tracker mechanism permits applications to know when transactions can be moved from one session to another. Transaction state tracking enables this, which is useful for applications that may wish to move transactions from a busy server to one that is less loaded. For example, a load-balancing connector managing a client connection pool could move transactions between available sessions in the pool.
然而,会话切换不能在任意时间进行。如果一个会话正在进行一个已经执行了读取或写入操作的事务,切换到另一个会话意味着原会话的事务将回滚。只有当事务尚未执行任何读取或写入操作时,才能进行会话切换。However, session switching cannot be done at arbitrary times. If a session is in the middle of a transaction for which reads or writes have been done, switching to a different session implies a transaction rollback on the original session. A session switch must be done only when a transaction does not yet have any reads or writes performed within it.
事务可能合理切换的示例:Examples of when transactions might reasonably be switched:
紧接着
START TRANSACTIONImmediately afterSTART TRANSACTION在
COMMIT AND CHAIN之后AfterCOMMIT AND CHAIN
除了了解事务状态之外,了解事务特性也很有用,以便在将事务移动到不同会话时使用相同的特性。以下特性与此目的相关:In addition to knowing transaction state, it is useful to know transaction characteristics, so as to use the same characteristics if the transaction is moved to a different session. The following characteristics are relevant for this purpose:
READ ONLY READ WRITE ISOLATION LEVEL WITH CONSISTENT SNAPSHOT
为了支持会话跟踪活动,针对以下类型的客户端会话状态信息提供通知:To support the session-tracking activities, notification is available for these types of client session state information:
客户端会话状态的以下属性变更:Changes to these attributes of client session state:
默认模式(数据库)。The default schema (database).
系统变量的会话特定值。Session-specific values for system variables.
用户定义的变量。User-defined variables.
临时表。Temporary tables.
预处理语句。Prepared statements.
session_track_state_change系统变量控制这个跟踪器。Thesession_track_state_changesystem variable controls this tracker.默认模式名称的更改。
session_track_schema系统变量控制这个跟踪器。Changes to the default schema name. Thesession_track_schemasystem variable controls this tracker.系统变量会话值的更改。
session_track_system_variables系统变量控制这个跟踪器。跟踪敏感系统变量值的更改需要SENSITIVE_VARIABLES_OBSERVER权限。Changes to the session values of system variables. Thesession_track_system_variablessystem variable controls this tracker. TheSENSITIVE_VARIABLES_OBSERVERprivilege is required to track changes to the values of sensitive system variables.可用的 GTID。
session_track_gtids系统变量控制此跟踪器。Available GTIDs. Thesession_track_gtidssystem variable controls this tracker.关于事务状态和特征的信息。
session_track_transaction_info系统变量控制此跟踪器。Information about transaction state and characteristics. Thesession_track_transaction_infosystem variable controls this tracker.
有关跟踪器相关系统变量的描述,请参见 第 7.1.8 节,“服务器系统变量”。这些系统变量允许控制发生哪些更改通知,但不提供访问通知信息的方式。通知发生在 MySQL 客户端/服务器协议中,该协议在 OK 包中包含跟踪器信息,以便能够检测会话状态的变化。For descriptions of the tracker-related system variables, see Section 7.1.8, “Server System Variables”. Those system variables permit control over which change notifications occur, but do not provide a way to access notification information. Notification occurs in the MySQL client/server protocol, which includes tracker information in OK packets so that session state changes can be detected.
为了使客户端应用程序能够从服务器返回的 OK 包中提取状态更改信息,MySQL C API 提供了一对函数:To enable client applications to extract state-change information from OK packets returned by the server, the MySQL C API provides a pair of functions:
mysql_session_track_get_first()获取从服务器接收到的状态更改信息的第一部分。请参阅 mysql_session_track_get_first()。mysql_session_track_get_first()fetches the first part of the state-change information received from the server. See mysql_session_track_get_first().mysql_session_track_get_next()获取从服务器接收的任何剩余状态更改信息。在成功调用mysql_session_track_get_first()之后,只要该函数返回成功,就重复调用此函数。请参阅 mysql_session_track_get_next()。mysql_session_track_get_next()fetches any remaining state-change information received from the server. Following a successful call tomysql_session_track_get_first(), call this function repeatedly as long as it returns success. See mysql_session_track_get_next().
mysqltest 程序具有 disable_session_track_info 和 enable_session_track_info 命令,用于控制会话跟踪器通知是否发生。您可以使用这些命令从命令行查看 SQL 语句生成的通知。假设文件 testscript 包含以下 mysqltest 脚本:The mysqltest program has
disable_session_track_info and
enable_session_track_info commands that
control whether session tracker notifications occur. You can use
these commands to see from the command line what notifications
SQL statements produce. Suppose that a file
testscript contains the following
mysqltest script:
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()。Run the script as follows to see the information provided by the
enabled trackers. For a description of the
Tracker: information displayed by
mysqltest for the various trackers, see
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 值指示已设置的下一事务值。Preceding the START
TRANSACTION statement, two SET
TRANSACTION statements execute that set the isolation
level and access mode characteristics for the next transaction.
The SESSION_TRACK_TRANSACTION_CHARACTERISTICS
value indicates those next-transaction values that have been
set.
在结束事务的COMMIT语句之后,SESSION_TRACK_TRANSACTION_CHARACTERISTICS的值会显示为空。这表明在事务开始之前设置的下一事务特性已被重置,并且会话默认值生效。要跟踪这些会话默认值的变化,请跟踪transaction_isolation和transaction_read_only系统变量的会话值。Following the COMMIT statement
that ends the transaction, the
SESSION_TRACK_TRANSACTION_CHARACTERISTICS
value is reported as empty. This indicates that the
next-transaction characteristics that were set preceding the
start of the transaction have been reset, and that the session
defaults apply. To track changes to those session defaults,
track the session values of the
transaction_isolation and
transaction_read_only system
variables.
要查看有关 GTID 的信息,请使用 session_track_gtids 系统变量启用 SESSION_TRACK_GTIDS 跟踪器。To see information about GTIDs, enable the
SESSION_TRACK_GTIDS tracker using the
session_track_gtids system
system variable.