int mysql_session_track_get_first(MYSQL * MYSQL, enum枚举session_state_type类型,const char **data, size_t *length)
MySQL实现了一种会话跟踪机制,服务器将会话状态变化的信息返回给客户端。为了控制服务器提供关于状态更改的通知,客户机应用程序设置具有表单名称的系统变量session_track_
,如xxx
session_track_state_change
,session_track_schema
,session_track_system_variables
.看到客户端会话状态的服务器跟踪.
更改通知发生在MySQL客户端/服务器协议中,它在OK包中包含跟踪器信息,因此可以检测到会话状态的更改。为了使客户端应用程序从OK包中提取状态变化信息,MySQL C API提供了一对函数:
mysql_session_track_get_first ()
获取从服务器接收的状态更改信息的第一部分。mysql_session_track_get_next ()
获取从服务器接收到的任何剩余状态更改信息。成功调用后mysql_session_track_get_first ()
,只要返回成功,就重复调用此函数。
的mysql_session_track_get_first ()
参数含义如下。这些描述也适用于mysql_session_track_get_next ()
,它接受相同的参数。
mysql
:连接处理程序。类型
:指示要检索的信息类型的跟踪器类型。控件的成员是允许的跟踪器值enum_session_state_type
枚举中定义mysql_com.h
: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
枚举。本节后面显示的示例代码演示了这种技术。(当然,如果枚举成员发生变化,则必须重新编译应用程序,使其能够考虑到新的跟踪器。)数据
: a的地址const char *
变量。在一个成功的调用之后,这个变量指向返回的数据,应该被认为是只读的。长度
: a的地址size_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语句,每个语句以分号结束:如果不应用任何特征,则字符串为空。应用会话默认值。(对于隔离级别和访问模式,这些默认值由
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
锁表
声明生效。
考虑一个由以下语句组成的会话,包括一个启用事务状态跟踪器的语句:
1.设置@@SESSION.session_track_transaction_info =“状态”;2.开始事务;3.选择1;4.INSERT INTO t1 () VALUES();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);if (mysql_query(mysql, stmt_str) != 0) {fprintf(stderr, "Error %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("受影响的行数:%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); } } }