10bet网址
MySQL 5.7 C API开发指南
本手册下载
PDF (Ltr)- 1.1 mb
PDF (A4)- 1.1 mb


5.4.67 mysql_session_track_get_first ()

int mysql_session_track_get_first(MYSQL * MYSQL, enum enum_session_state_type类型,const char **data, size_t *length)

描述

MySQL实现了一种会话跟踪机制,通过这种机制,服务器将会话状态变化的信息返回给客户端。为了控制服务器提供的关于状态更改的通知,客户端应用程序设置了具有表单名称的系统变量session_track_xxx,如session_track_state_changesession_track_schema,session_track_system_variables.看到服务器跟踪客户端会话状态

更改通知发生在MySQL客户端/服务器协议中,它在OK包中包含跟踪器信息,以便能够检测到会话状态的更改。为了使客户端应用程序能够从OK数据包中提取状态变化信息,MySQL C API提供了一对函数:

mysql_session_track_get_first ()各参数说明如下。这些描述也适用于mysql_session_track_get_next (),它接受相同的参数。

  • mysql:连接处理程序。

  • 类型:跟踪器类型,指示要检索的信息类型。的成员是允许的跟踪器值enum_session_state_type枚举中定义mysql_com.h

    enum enum_session_state_type {SESSION_TRACK_SYSTEM_VARIABLES, /*会话系统变量*/ SESSION_TRACK_SCHEMA, /*当前模式*/ SESSION_TRACK_STATE_CHANGE, /*会话状态变化*/ SESSION_TRACK_GTIDS, /* GTIDs */ SESSION_TRACK_TRANSACTION_CHARACTERISTICS, /*事务特征*/ SESSION_TRACK_TRANSACTION_STATE /*事务状态*/};

    该枚举的成员可能会随着时间的推移而改变,因为MySQL实现了额外的会话信息跟踪器。为了方便应用程序循环遍历所有可能的跟踪器类型,而不管其成员的数量SESSION_TRACK_BEGIN而且SESSION_TRACK_END的第一个和最后一个成员定义为相等的符号enum_session_state_type枚举。本节后面展示的示例代码演示了这种技术。(当然,如果枚举成员改变,您必须重新编译您的应用程序,使其能够考虑新的跟踪器。)

  • 数据: aconst char *变量。在调用成功之后,此变量指向返回的数据,该数据应该被认为是只读的。

  • 长度: asize_t变量。方法所指向的数据的长度数据参数。

下面的讨论描述了如何解释数据而且长度根据类型价值。它还指示哪个系统变量为每个跟踪器类型启用通知。

  • SESSION_TRACK_SCHEMA:此跟踪器类型表明默认模式已设置。数据包含新的默认架构名称的字符串。长度字符串长度。

    要启用此跟踪器类型的通知,请启用session_track_schema系统变量。

  • SESSION_TRACK_SYSTEM_VARIABLES:这种跟踪器类型表明一个或多个被跟踪的会话系统变量已被赋值。当分配一个会话系统变量时,每个变量返回两个值(在单独的调用中)。第一个电话,数据字符串是否包含变量名和长度字符串长度。对于第二个电话,数据字符串是否包含变量值和长度字符串长度。

    默认情况下,这些会话系统变量的通知是启用的:

    要更改此跟踪器类型的默认通知,请设置session_track_schema将系统变量转换为要跟踪其变化的逗号分隔的变量列表,或跟踪所有变量的变化。要禁用会话变量赋值通知,设置session_track_system_variables指向空字符串。

  • SESSION_TRACK_STATE_CHANGE:此跟踪器类型表示对会话状态的某些跟踪属性的更改。数据包含一个布尔标志的字节,该标志指示会话状态是否发生更改。长度应该是1。该标志用ASCII值表示,而不是二进制值(例如,' 1 ',而不是0 x01).

    要启用此跟踪器类型的通知,请启用session_track_state_change系统变量。

    这个跟踪器报告会话状态的这些属性的变化:

    • 默认模式(数据库)。

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

    • 用户定义的变量。

    • 临时表。

    • 准备好的语句。

  • SESSION_TRACK_GTIDS:此跟踪器类型表明gtid可用。数据包含GTID字符串。长度字符串长度。GTID字符串是用于指定一组GTID值的标准格式;看到GTID集

    要启用此跟踪器类型的通知,请设置session_track_gtids系统变量。

  • SESSION_TRACK_TRANSACTION_CHARACTERISTICS:此跟踪器类型指示事务特征可用。数据是包含特征数据的字符串。长度字符串长度。特征跟踪器数据字符串可以是空的,也可以包含一个或多个SQL语句,每个SQL语句以分号结束:

    • 如果没有应用任何特征,则字符串为空。应用会话缺省值。(对于隔离级别和访问模式,这些默认值由transaction_isolation而且transaction_read_only系统变量)。

    • 如果显式地启动了事务,则该字符串包含以相同特征重新启动事务所需的语句。一般来说,这是一个开始事务语句(可能包含一个或多个只读阅读写,与一致的快照).如果应用了不能传递给的任何特征开始事务,如隔离级别,一个合适的设置事务语句是前置的(例如,设置事务隔离级别可序列化;开始事务读写;).

    • 如果没有显式地启动事务,但是设置了只应用于下一个事务的一次性特征,则会产生设置事务语句(例如,设置事务只读;).

      可以使用设置下一个事务的特征设置事务没有任何全球会话关键字,或通过设置transaction_isolation而且transaction_read_only使用只适用于下一个事务的语法的系统变量:

      设置@@transaction_isolation =价值;设置@@transaction_read_only =价值

      有关事务特征范围级别及其设置方式的详细信息,请参见事务特征范围

    要启用此跟踪器类型的通知,请设置session_track_transaction_info系统变量特征(这也启用了SESSION_TRACK_TRANSACTION_STATE跟踪类型)。

    事务特征跟踪使客户端能够确定如何在另一个会话中重新启动事务,使其具有与原始会话相同的特征。

    因为特征可以用设置事务在事务启动之前,如果没有事务处于活动状态,则客户端假设没有事务特征是不安全的。因此,如果不跟踪事务特征,只在没有活动事务时切换连接(无论这是由事务状态跟踪器还是传统的跟踪器检测到的),是不安全的SERVER_STATUS_IN_TRANS国旗)。一个客户端必须如果事务特征跟踪器希望在某个时刻将其会话切换到另一个连接,并且可能会使用事务,则订阅该事务特征跟踪器。

    特征跟踪器跟踪对只应用于下一个事务的一次性特征的更改。它不跟踪会话变量的更改。因此,客户端还必须跟踪transaction_isolation而且transaction_read_only系统变量来正确确定下一个事务特征值为空时应用的会话缺省值。(要跟踪这些变量,请在session_track_system_variables系统变量)。

  • SESSION_TRACK_TRANSACTION_STATE:此跟踪器类型指示事务状态信息可用。数据是一个包含ASCII字符的字符串,每个字符表示事务状态的某个方面。长度字符串长度(总是8)。

    要启用此跟踪器类型的通知,请设置session_track_transaction_info系统变量状态

    事务状态跟踪使客户机能够确定事务是否正在进行,以及是否可以将其移动到不同的会话而不进行回滚。

    跟踪项的范围是事务。所有状态指示标志将持续存在,直到提交或回滚事务。在向事务添加语句时,可以在后续跟踪器数据值中设置额外的标志。但是,在事务结束之前不会清除标志。

    事务状态报告为包含ASCII字符序列的字符串。每个活动状态都有一个被分配给它的唯一字符,以及在序列中的固定位置。下面的列表描述了序列中位置1到8的允许值:

    • 位置1:活动事务是否正在进行。

      • T:一个显式启动的事务正在进行中。

      • :隐式启动的事务(自动提交= 0)正在进行。

      • _:没有活动事务。

    • 位置2:是否在当前事务的上下文中读取非事务性表。

      • r:读取一个或多个非事务性表。

      • _:到目前为止,没有读取非事务性表。

    • 位置3:是否在当前事务的上下文中读取事务表。

      • R:读取一个或多个事务表。

      • _:到目前为止没有事务表被读取。

    • 位置4:是否在当前事务的上下文中执行不安全的写操作(对非事务性表的写操作)。

      • w:写入一个或多个非事务性表。

      • _:到目前为止,没有写非事务性表。

    • 位置5:是否在当前事务的上下文中写入任何事务表。

      • W:写入一个或多个事务表。

      • _:到目前为止没有写事务表。

    • 位置6:在当前事务的上下文中是否执行了任何不安全的语句。包含非确定性构造的语句,例如RAND ()UUID ()对于基于语句的复制是不安全的。

      • 年代:执行了一个或多个不安全语句。

      • _:到目前为止,没有执行不安全语句。

    • 位置7:在当前事务期间是否将结果集发送给客户端。

      • 年代:发送结果集。

      • _:到目前为止没有发送结果集。

    • 位置8:是否a锁表声明生效。

      • l:表显式地被锁住锁表

      • _锁表在会话中不是活动的。

    考虑一个由以下语句组成的会话,其中包括启用事务状态跟踪器的语句:

    1.设置@@SESSION.session_track_transaction_info =“状态”;2.开始事务;3.选择1;4.INSERT INTO t1 ()5.INSERT INTO t1 () VALUES(1, RAND()); 6. COMMIT;

    启用事务状态跟踪后,执行以下操作数据这些语句产生的值:

    1.在2。T_______ 3。T_____S_ 4。T___W_S_ 5。T___WsS_ 6。________

返回值

成功的为零。如果发生错误,则为非零。

错误

一个也没有。

例子

下面的例子展示了如何调用mysql_session_track_get_first ()而且mysql_session_track_get_next ()检索和显示成功执行SQL语句字符串后的所有可用会话状态更改信息(由stmt_str).假定应用程序已经设置了session_track_xxx启用它希望接收的通知的系统变量。

printf("执行:% s \ n”,stmt_str);如果(mysql_query(mysql, stmt_str) != 0) {fprintf(stderr, "错误%u: %s\n", mysql_errno(mysql), mysql_error(mysql));返回;} MYSQL_RES *result = mysql_store_result(mysql);如果(result) /*有一个结果集来获取*/{/*…在这里处理行…*/ printf("返回的行数:%lu\n", (unsigned long) mysql_num_rows(result));mysql_free_result(结果);} else /*没有结果集*/ {if (mysql_field_count(mysql) == 0) {printf("Number of rows affected: %lu\n", (unsigned long) mysql_affected_rows(mysql));} else /*一个错误发生*/ {fprintf(stderr, " error %u: %s\n", mysql_errno(mysql), mysql_error(mysql)); } } /* extract any available session state-change information */ enum enum_session_state_type type; for (type = SESSION_TRACK_BEGIN; type <= SESSION_TRACK_END; type++) { const char *data; size_t length; if (mysql_session_track_get_first(mysql, type, &data, &length) == 0) { /* print info type and initial data */ printf("Type=%d:\n", type); printf("mysql_session_track_get_first(): length=%d; data=%*.*s\n", (int) length, (int) length, (int) length, data); /* check for more data */ while (mysql_session_track_get_next(mysql, type, &data, &length) == 0) { printf("mysql_session_track_get_next(): length=%d; data=%*.*s\n", (int) length, (int) length, (int) length, data); } } }