• 首页
  • css3教程
  • html5教程
  • jQuery手册
  • vue手册
  • php手册
  • MySQL手册
  • apache手册
  • redis手册
  • MySQL服务器跟踪客户端会话状态更改

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

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

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

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

    何时可以合理地切换交易的示例:

    • 之后立马START TRANSACTION
    • COMMIT AND CHAIN

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

    READ ONLY 
    READ WRITE
    ISOLATION LEVEL
    WITH CONSISTENT SNAPSHOT
    

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

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

      • 默认架构(数据库)。
      • 系统变量的特定于会话的值。
      • 用户定义的变量。
      • 临时表。
      • 准备好的语句。

      所述session_track_state_change系统变量控制此追踪。

    • 更改为默认架构名称。所述session_track_schem 系统变量控制此追踪。
    • 更改系统变量的会话值。所述session_track_system_variables系统变量控制此追踪。
    • 可用的GTID。所述session_track_gtids系统变量控制此追踪。
    • 有关交易状态和特征的信息。所述session_track_transaction_info系统变量控制此追踪。

    有关与跟踪器相关的系统变量的描述,请参见“服务器系统变量”。这些系统变量允许控制发生更改通知的内容,但不提供访问通知信息的方法。通知发生在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_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_schem =ON;
    SET @@SESSION.session_track_system_variables='*';
    SET @@SESSION.session_track_state_change=ON;
    USE information_schem ;
    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()”。

    shell>mysqltest < testscript
    DROP TABLE IF EXISTS test.t1;
    CREATE TABLE test.t1 (i INT, f FLOAT);
    SET @@SESSION.session_track_schem =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_schem ;
    -- Tracker : SESSION_TRACK_SCHEMA
    -- information_schem 
    
    -- 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系统变量的会话值。