性能模式instrument事务。在事件层次结构中,等待事件嵌套在阶段事件中,阶段事件嵌套在语句事件中,语句事件嵌套在事务事件中。
这些表存储事务事件:
-
events_transactions_current
:每个线程的当前事务事件。 -
events_transactions_history
:每个线程结束的最新事务事件。 -
events_transactions_history_long
:所有线程结束的最新事务事件。
以下部分描述事务事件表。还有汇总表,聚合事务事件信息;见 第 29.12.20.5 节,“事务汇总表”。
有关三个事务事件表之间的关系的更多信息,请参见 第 29.9 节,“性能模式当前和历史事件表”。
配置事务事件收集
要控制是否收集事务事件,请设置相关仪器和消费者的状态:
-
The
setup_instruments
表包含一个名为transaction
的仪器。使用该仪器来启用或禁用个别事务事件类的收集。 -
The
setup_consumers
表包含消费者值,名称对应于当前和历史事务事件表名称。使用这些消费者来过滤事务事件的收集。
The transaction
仪器和 events_transactions_current
和 events_transactions_history
事务消费者默认启用:
mysql> SELECT NAME, ENABLED, TIMED
FROM performance_schema.setup_instruments
WHERE NAME = 'transaction';
+-------------+---------+-------+
| NAME | ENABLED | TIMED |
+-------------+---------+-------+
| transaction | YES | YES |
+-------------+---------+-------+
mysql> SELECT *
FROM performance_schema.setup_consumers
WHERE NAME LIKE 'events_transactions%';
+----------------------------------+---------+
| NAME | ENABLED |
+----------------------------------+---------+
| events_transactions_current | YES |
| events_transactions_history | YES |
| events_transactions_history_long | NO |
+----------------------------------+---------+
在服务器启动时控制事务事件收集,使用以下行在您的 my.cnf
文件中:
-
启用:
[mysqld] performance-schema-instrument='transaction=ON' performance-schema-consumer-events-transactions-current=ON performance-schema-consumer-events-transactions-history=ON performance-schema-consumer-events-transactions-history-long=ON
-
禁用:
[mysqld] performance-schema-instrument='transaction=OFF' performance-schema-consumer-events-transactions-current=OFF performance-schema-consumer-events-transactions-history=OFF performance-schema-consumer-events-transactions-history-long=OFF
要在运行时控制事务事件收集,更新 setup_instruments
和 setup_consumers
表:
-
启用:
UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES' WHERE NAME = 'transaction'; UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE 'events_transactions%';
-
禁用:
UPDATE performance_schema.setup_instruments SET ENABLED = 'NO', TIMED = 'NO' WHERE NAME = 'transaction'; UPDATE performance_schema.setup_consumers SET ENABLED = 'NO' WHERE NAME LIKE 'events_transactions%';
要仅对特定事务事件表收集事务事件,启用 transaction
仪器,但仅对应于所需表的事务消费者。
有关配置事件收集的更多信息,请参阅 第 29.3 节,“Performance Schema 启动配置”,和 第 29.4 节,“Performance Schema 运行时配置”。
事务边界
在 MySQL 服务器中,事务以以下语句显式启动:
START TRANSACTION | BEGIN | XA START | XA BEGIN
事务也隐式启动。例如,当 autocommit
系统变量启用时,每个语句的开始都会启动一个新事务。
当 autocommit
禁用时,提交事务后的第一个语句将标记新事务的开始。随后的语句都是该事务的一部分,直到其被提交。
事务以以下语句显式结束:
COMMIT | ROLLBACK | XA COMMIT | XA ROLLBACK
事务也隐式结束,通过执行 DDL 语句、锁定语句和服务器管理语句。
在以下讨论中,对 START TRANSACTION
的引用也适用于 BEGIN
、XA START
和 XA BEGIN
。类似地,对 COMMIT
和 ROLLBACK
的引用也适用于 XA COMMIT
和 XA ROLLBACK
。
Performance Schema 定义事务边界类似于服务器。事务事件的开始和结束紧密匹配服务器中的状态转换:
-
对于显式启动的事务,事务事件在处理
START TRANSACTION
语句时开始。 -
对于隐式启动的事务,事务事件在处理第一个使用事务引擎的语句时开始,前一个事务已经结束。
-
对于任何事务,无论是显式还是隐式结束,事务事件在服务器从活动事务状态转换到
COMMIT
或ROLLBACK
语句时结束。
这种方法有微妙的含义:
-
Performance Schema 中的事务事件不包括对应的
START TRANSACTION
、COMMIT
或ROLLBACK
语句的语句事件。事务事件和这些语句之间存在微小的时间重叠。 -
使用非事务引擎的语句对连接的事务状态没有影响。对于隐式事务,事务事件从使用事务引擎的第一个语句开始。这意味着,仅在非事务表上操作的语句将被忽略,即使在
START TRANSACTION
之后。
为了说明,考虑以下场景:
1. SET autocommit = OFF;
2. CREATE TABLE t1 (a INT) ENGINE = InnoDB;
3. START TRANSACTION; -- Transaction 1 START
4. INSERT INTO t1 VALUES (1), (2), (3);
5. CREATE TABLE t2 (a INT) ENGINE = MyISAM; -- 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 直到访问事务表时才开始,尽管中间有对非事务表的更新。
从性能模式的角度看,事务 2 在服务器转换为活动事务状态时开始。语句 6 和 7 不在事务 2 的边界内,这与服务器将事务写入二进制日志是一致的。
事务仪表
三个属性定义事务:
-
访问模式(只读、读写)
-
隔离级别(
SERIALIZABLE
、REPEATABLE READ
等) -
隐式(
autocommit
启用)或显式(autocommit
禁用)
为了减少事务仪表的复杂性,并确保收集的事务数据提供完整、有意义的结果,所有事务都独立于访问模式、隔离级别或 autocommit 模式进行仪表。
要选择性地检查事务历史记录,可以使用事务事件表中的属性列:ACCESS_MODE
、ISOLATION_LEVEL
和 AUTOCOMMIT
。
事务仪表的成本可以通过各种方式减少,例如根据用户、账户、主机或线程(客户端连接)启用或禁用事务仪表。
事务和嵌套事件
事务事件的父级是启动事务的事件。对于显式启动的事务,这包括 START TRANSACTION
和 COMMIT AND CHAIN
语句。对于隐式启动的事务,它是第一个使用事务引擎的语句,位于前一个事务结束之后。
一般来说,事务是所有在事务期间启动的事件的顶级父级,包括明确结束事务的语句,例如 COMMIT
和 ROLLBACK
。例外是隐式结束事务的语句,例如 DDL 语句,在这种情况下,当前事务必须在执行新语句之前提交。
事务和存储程序
事务和存储程序事件之间的关系如下:
-
存储过程
存储过程独立于事务运行。存储过程可以在事务中启动,并且事务可以在存储过程中启动或结束。如果从事务中调用存储过程,存储过程可以执行语句,以强制提交父事务,然后启动新事务。
如果存储过程在事务中启动,那么该事务就是存储过程事件的父级。
如果事务是由存储过程启动的,那么存储过程就是事务事件的父级。
-
存储函数
存储函数被限制不能引起明确或隐式的提交或回滚。存储函数事件可以驻留在父事务事件中。
-
触发器
触发器作为访问关联表的语句的一部分激活,因此触发器事件的父级总是激活它的语句。
触发器不能发出语句,以引起事务的明确或隐式提交或回滚。
-
计划事件
计划事件体中的语句执行在新的连接中。计划事件在父事务中的嵌套不适用。
事务和保存点
保存点语句被记录为单独的语句事件。事务事件包括单独的计数器,用于记录在事务中执行的 SAVEPOINT
、ROLLBACK TO SAVEPOINT
和 RELEASE SAVEPOINT
语句。
事务和错误
在事务中发生的错误和警告被记录在语句事件中,但不在相应的事务事件中。这包括事务特定的错误和警告,例如在非事务表上回滚或 GTID 一致性错误。