10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 本手册下载 本手册节选

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

5.1.18服务器跟踪客户端会话状态变化

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

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

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

然而,会话切换不能在任意时间进行。如果一个会话处于已经完成读写的事务的中间,则切换到另一个会话意味着在原始会话上进行事务回滚。只有在事务中尚未执行任何读或写操作时,才必须进行会话切换。

可以合理切换事务的例子:

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

具有一致性快照的只读读写隔离级别

为了支持上述会话切换活动,以下类型的客户端会话状态信息可以使用通知:

有关与跟踪器相关的系统变量的描述,请参见第5.1.8节,“服务器系统变量”.这些系统变量允许控制发生哪些更改通知,但不提供访问通知信息的方法。通知发生在MySQL客户端/服务器协议中,它在OK包中包含跟踪器信息,以便检测会话状态的变化。为了使客户端应用程序从服务器返回的OK包中提取状态变化信息,MySQL C API提供了一对函数:

mysqltest程序有disable_session_track_info而且enable_session_track_info控制是否发生会话跟踪器通知的命令。您可以使用这些命令从命令行查看SQL语句产生了什么通知。假设一个文件testscript包含以下mysqltest脚本:

DROP TABLE IF EXISTS test.t1创建表的测试。t1 (i INT, f FLOAT);——enable_session_track_info设置@@SESSION.session_track_schema =;设置@@SESSION.session_track_system_variables =‘*’;设置@@SESSION.session_track_state_change =;使用information_schema;设置名称“utf8mb4”;设置@@SESSION.session_track_transaction_info =“特点”;设置事务隔离级别可序列化; SET TRANSACTION READ WRITE; START TRANSACTION; SELECT 1; INSERT INTO test.t1 () VALUES(); INSERT INTO test.t1 () VALUES(1, RAND()); COMMIT;

运行以下脚本,查看已启用的跟踪器提供的信息。的描述跟踪器:显示的信息mysqltest有关各种跟踪器,请参见mysql_session_track_get_first ()

shell> mysqltest < testscript DROP TABLE IF EXISTS test.t1创建表的测试。t1 (i INT, f FLOAT);设置@@SESSION.session_track_schema =;设置@@SESSION.session_track_system_variables =‘*’;——跟踪器:SESSION_TRACK_SYSTEM_VARIABLES——SESSION_TRACK_SYSTEM_VARIABLES——* SET @@SESSION.session_track_state_change=ON;——跟踪器: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';——跟踪器:SESSION_TRACK_SYSTEM_VARIABLES——character_set_client——utf8mb4——character_set_connection——utf8mb4——character_set_results——utf8mb4——跟踪器:SESSION_TRACK_STATE_CHANGE——1 SET @@SESSION.session_track_transaction_info='CHARACTERISTICS';——追踪器:SESSION_TRACK_SYSTEM_VARIABLES——session_track_transaction_info——CHARACTERISTICS——追踪器:SESSION_TRACK_STATE_CHANGE——1——追踪器:SESSION_TRACK_TRANSACTION_CHARACTERISTICS -- --追踪器: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

开始事务声明中,两个设置事务语句的执行为下一个事务设置隔离级别和访问模式特征。的SESSION_TRACK_TRANSACTION_CHARACTERISTICSValue指示已设置的下一个事务值。

后,提交语句结束事务SESSION_TRACK_TRANSACTION_CHARACTERISTICS值报告为空。这表明在事务开始之前设置的下一个事务特征已经重置,并且应用了会话默认值。控件的会话值来跟踪对这些会话默认值的更改transaction_isolation而且transaction_read_only系统变量。