性能模式检测事务。在事件层次结构中,等待事件嵌套在阶段事件中,阶段事件嵌套在语句事件中,语句事件嵌套在事务事件中。
这些表存储事务事件:
events_transactions_current
:每个线程的当前事务事件。events_transactions_history
:每个线程最近结束的事务事件。events_transactions_history_long
全局(跨所有线程)结束的最近的事务事件。
以下部分描述事务事件表。还有汇总事务事件信息的汇总表;看到第25.12.15.4节“交易汇总表”.
有关三个事务事件表之间关系的详细信息,请参见第25.9节,“当前和历史事件的性能模式表”.
配置事务事件收集
要控制是否收集事务事件,请设置相关工具和消费者的状态:
的
setup_instruments
表中包含一个名为事务
.使用此工具可启用或禁用单个事务事件类的收集。的
setup_consumers
表包含消费者值,其名称与当前和历史事务事件表名称相对应。使用这些消费者来过滤事务事件集合。
的事务
默认情况下,工具和事务消费者是禁用的:
mysql> SELECT * FROM performance_schemasetup_instrumentsWHERE NAME = 'transaction'; +-------------+---------+-------+ | NAME | ENABLED | TIMED | +-------------+---------+-------+ | transaction | NO | NO | +-------------+---------+-------+ mysql> SELECT * FROM performance_schema.setup_consumers WHERE NAME LIKE 'events_transactions%'; +----------------------------------+---------+ | NAME | ENABLED | +----------------------------------+---------+ | events_transactions_current | NO | | events_transactions_history | NO | | events_transactions_history_long | NO | +----------------------------------+---------+
要在服务器启动时控制事务事件收集,请在您的my.cnf
文件:
启用:
performance-schema-consumer-events-transactions-history=ON performance-schema-consumer-events-transactions-history-long=ON
禁用:
[mysqld] performance-schema-consumer-events-transactions-current=OFF性能-schema-consumer-events-transactions-history=OFF
要在运行时控制事务事件集合,请更新setup_instruments
和setup_consumers
表:
启用:
更新performance_schema。setup_instrumentsSET ENABLED = 'YES', TIMED = 'YES' WHERE NAME = 'transaction'; UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE 'events_transactions%';
禁用:
更新performance_schema。setup_instrumentsSET ENABLED = 'NO', TIMED = 'NO' WHERE NAME = 'transaction'; UPDATE performance_schema.setup_consumers SET ENABLED = 'NO' WHERE NAME LIKE 'events_transactions%';
若要仅收集特定事务事件表的事务事件,请启用事务
工具,但只使用与所需表对应的事务消费者。
的setup_timer
表包含带有名字
的价值事务
它指示事务事件计时的单位。默认单位为纳秒
:
mysql> SELECT * FROM performance_schemasetup_timerWHERE NAME = 'transaction'; +-------------+------------+ | NAME | TIMER_NAME | +-------------+------------+ | transaction | NANOSECOND | +-------------+------------+
要更改定时单位,请修改TIMER_NAME
值:
更新performance_schema。setup_timerSET TIMER_NAME = 'MICROSECOND' WHERE NAME = 'transaction';
有关配置事件收集的其他信息,请参见第25.3节,“性能模式启动配置”,第25.4节,“性能模式运行时配置”.
事务边界
在MySQL服务器中,事务显式地以这些语句开始:
启动事务| begin | xa Start | xa begin
事务也是隐式启动的。例如,当自动提交
启用系统变量后,每条语句的开始都会启动一个新的事务。
当自动提交
,则提交事务后的第一个语句标志着新事务的开始。在事务提交之前,后续语句都是事务的一部分。
事务显式地以以下语句结束:
Commit | rollback | xa Commit | xa rollback
事务也通过执行DDL语句、锁定语句和服务器管理语句隐式结束。
在接下来的讨论中,参考开始事务
也适用于开始
,XA开始
,XA开始
.类似地,对提交
和回滚
适用于XA提交
和XA回滚
,分别。
性能模式定义的事务边界类似于服务器的事务边界。事务事件的开始和结束与服务器中相应的状态转换密切匹配:
这种方法有一些微妙的含义:
为了说明这一点,请考虑以下场景:
1.设置autocommit = OFF;2.创建表t1 (a INT)3.开始事务;——事务1INSERT INTO t1 VALUES (1), (2), (3);5.创建表t2 (a INT) -- Transaction 1 COMMIT -- (implicit; DDL forces commit) 6. INSERT INTO t2 VALUES (1), (2), (3); -- Update nontransactional table 7. UPDATE t2 SET a = a + 1; -- ... and again 8. INSERT INTO t1 VALUES (4), (5), (6); -- Write to transactional table -- Transaction 2 START (implicit) 9. COMMIT; -- Transaction 2 COMMIT
从服务器的角度来看,事务1在表时结束t2
被创建。事务2直到访问事务性表时才启动,尽管其间对非事务性表进行了更新。
从Performance Schema的角度来看,事务2在服务器转换到活动事务状态时启动。语句6和7不包括在事务2的边界内,这与服务器将事务写入二进制日志的方式一致。
交易工具
三个属性定义事务:
为了降低事务插装的复杂性,并确保收集的事务数据提供完整、有意义的结果,所有事务都独立于访问模式、隔离级别或自动提交模式进行插装。
要有选择性地检查事务历史,请使用事务事件表中的属性列:ACCESS_MODE
,ISOLATION_LEVEL
,自动提交
.
可以通过各种方式降低事务插装的成本,例如根据用户、帐户、主机或线程(客户机连接)启用或禁用事务插装。
事务和嵌套事件
事务事件的父事件是启动事务的事件。对于显式启动的事务,这包括开始事务
和提交和链接
语句。对于隐式启动的事务,它是在前一个事务结束后使用事务引擎的第一个语句。
通常,事务是事务期间启动的所有事件的顶级父级,包括显式结束事务的语句,例如提交
和回滚
.异常是隐式结束事务的语句,例如DDL语句,在这种情况下,必须在执行新语句之前提交当前事务。
事务和存储程序
事务和存储的程序事件的关系如下:
存储过程
存储过程的操作独立于事务。存储过程可以在事务中启动,事务可以在存储过程中启动或结束。如果从事务内部调用,存储过程可以执行强制提交父事务的语句,然后启动新事务。
如果在事务中启动存储过程,则该事务是存储过程事件的父级。
如果事务由存储过程启动,则该存储过程是事务事件的父过程。
存储功能
存储函数受到限制,不能导致显式或隐式提交或回滚。存储的函数事件可以驻留在父事务事件中。
触发器
触发器作为访问与之关联的表的语句的一部分激活,因此触发器事件的父级始终是激活它的语句。
触发器不能发出导致显式或隐式提交或回滚事务的语句。
预定的事件
计划事件主体中的语句在新连接中执行。在父事务中嵌套计划事件不适用。
事务和保存点
保存点语句被记录为单独的语句事件。事务事件包括单独的计数器保存点
,回滚到保存点
,RELEASE SAVEPOINT
在交易过程中发出的报表。
事务和错误
事务中发生的错误和警告记录在语句事件中,而不是记录在相应的事务事件中。这包括特定于事务的错误和警告,例如非事务表上的回滚或GTID一致性错误。