服务器跟踪客户端会话状态更改

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

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

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

但是,会话切换不能在任意时间进行。如果会话位于已完成读取或写入的事务的中间,则切换到其他会话意味着原始会话上的事务回滚。仅当事务尚未在其中执行任何读取或写入时,才可以执行会话切换。

何时可以合理地切换事务的示例:

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

 

READ ONLY 
READ WRITE
ISOLATION LEVEL
WITH CONSISTENT SNAPSHOT

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

  • 对客户端会话状态的以下属性的更改:

  • 默认架构(数据库)。

  • 系统变量的特定于会话的值。

  • 用户定义的变量。

  • 临时表。

  • 准备好的语句。

session_track_state_change系统变量控制这些追踪。

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

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: 显示的信息 的描述 ,请参见第27.8.7.65节“ mysql_session_track_get_first()”

shell> 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系统变量的会话值。

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值