MySQL服务器实现了几个会话状态跟踪器。客户端可以使这些跟踪器接收其会话状态更改的通知。
会话状态跟踪器有如下用途:
方便会话迁移。
方便事务切换。
跟踪器机制的一个用途是为MySQL连接器和客户机应用程序提供一种方法,以确定是否有任何会话上下文可用,以便允许会话从一台服务器迁移到另一台服务器。(为了在负载均衡的环境中更改会话,在决定是否可以进行切换时,需要检测是否有会话状态需要考虑。)
跟踪器机制的另一个用途是允许应用程序知道何时可以将事务从一个会话移动到另一个会话。事务状态跟踪支持这一点,这对于希望将事务从繁忙的服务器转移到负载较轻的服务器的应用程序非常有用。例如,管理客户机连接池的负载平衡连接器可以在池中可用的会话之间移动事务。
然而,会话切换不能在任意时间进行。如果一个会话处于已经完成读写的事务的中间,则切换到另一个会话意味着在原始会话上进行事务回滚。只有在事务中尚未执行任何读或写操作时,才必须进行会话切换。
可以合理切换事务的例子:
除了了解事务状态外,了解事务特征也很有用,以便在事务移动到不同的会话时使用相同的特征。以下特点与此有关:
具有一致性快照的只读读写隔离级别
为了支持会话跟踪活动,可以使用以下类型的客户端会话状态信息的通知:
更改客户端会话状态的这些属性:
默认模式(数据库)。
系统变量的特定于会话的值。
用户定义的变量。
临时表。
准备好的语句。
的
session_track_state_change
系统变量控制这个跟踪器。对默认模式名称的更改。的
session_track_schema
系统变量控制这个跟踪器。更改系统变量的会话值。的
session_track_system_variables
系统变量控制这个跟踪器。GTIDs可用。的
session_track_gtids
系统变量控制这个跟踪器。关于事务状态和特征的信息。的
session_track_transaction_info
系统变量控制这个跟踪器。
有关与跟踪器相关的系统变量的描述,请参见第5.1.7节,“服务器系统变量”.这些系统变量允许控制发生哪些更改通知,但不提供访问通知信息的方法。通知发生在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创建表的测试。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 ().
$> 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_CHARACTERISTICS
Value指示已设置的下一个事务值。
后,提交
语句结束事务SESSION_TRACK_TRANSACTION_CHARACTERISTICS
值报告为空。这表明在事务开始之前设置的下一个事务特征已经重置,并且应用了会话默认值。控件的会话值来跟踪对这些会话默认值的更改transaction_isolation
而且transaction_read_only
系统变量。
要查看关于gtid的信息,请启用SESSION_TRACK_GTIDS
跟踪器使用session_track_gtids
系统系统变量。