文档首页
MySQL 9.0 参考手册
相关文档 下载此手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  性能模式事务表

29.12.7 性能模式事务表

性能模式检测事务。在事件层次结构中,等待事件嵌套在阶段事件中,阶段事件嵌套在语句事件中,语句事件嵌套在事务事件中。

这些表存储事务事件

以下部分介绍事务事件表。还有一些汇总表会汇总有关事务事件的信息;请参见 第 29.12.20.5 节,“事务汇总表”

有关三个事务事件表之间关系的更多信息,请参见 第 29.9 节,“用于当前和历史事件的性能模式表”

配置事务事件收集

若要控制是否收集事务事件,请设置相关仪器和消费者的状态

  • setup_instruments 表包含名为 transaction 的仪器。使用此仪器可以启用或禁用对各个事务事件类的收集。

  • setup_consumers 表包含消费者值,其名称对应于当前和历史事务事件表名。使用这些消费者可以过滤事务事件的收集。

transaction 仪器以及 events_transactions_currentevents_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_instrumentssetup_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 节,“性能模式启动配置”,以及 第 29.4 节,“性能模式运行时配置”

事务边界

在 MySQL 服务器中,事务以以下语句显式开始

START TRANSACTION | BEGIN | XA START | XA BEGIN

事务也会隐式开始。例如,当 autocommit 系统变量处于启用状态时,每个语句的开始都会启动一个新的事务。

autocommit 禁用时,提交事务后的第一个语句标志着新事务的开始。后续语句属于事务的一部分,直到事务被提交。

事务以以下语句显式结束

COMMIT | ROLLBACK | XA COMMIT | XA ROLLBACK

事务也以隐式结束,通过执行 DDL 语句、锁定语句和服务器管理语句。

在下面的讨论中,对 START TRANSACTION 的引用也适用于 BEGINXA STARTXA BEGIN。类似地,对 COMMITROLLBACK 的引用分别适用于 XA COMMITXA ROLLBACK

性能模式将事务边界定义为类似于服务器的边界。事务事件的开始和结束与服务器中相应的状态转换紧密匹配。

  • 对于显式启动的事务,事务事件在处理 START TRANSACTION 语句期间开始。

  • 对于隐式启动的事务,事务事件在先前事务结束后的第一个使用事务引擎的语句上开始。

  • 对于任何事务,无论是显式还是隐式结束,事务事件在服务器在处理 COMMITROLLBACK 期间从活动事务状态转换出来时结束。

这种方法有一些微妙的含义。

  • 性能模式中的事务事件并不完全包含与相应的 START TRANSACTIONCOMMITROLLBACK 语句相关联的语句事件。事务事件与这些语句之间存在少量的计时重叠。

  • 使用非事务引擎的语句不会影响连接的事务状态。对于隐式事务,事务事件从第一个使用事务引擎的语句开始。这意味着仅对非事务表进行操作的语句将被忽略,即使在 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 的边界内,这与服务器如何将事务写入二进制日志是一致的。

事务检测

三个属性定义事务。

为了降低事务检测的复杂性,并确保收集的事务数据提供完整、有意义的结果,所有事务的检测都与访问模式、隔离级别或自动提交模式无关。

要选择性地检查事务历史记录,请使用事务事件表中的属性列:ACCESS_MODEISOLATION_LEVELAUTOCOMMIT

可以通过多种方式降低事务检测的成本,例如根据用户、帐户、主机或线程(客户端连接)启用或禁用事务检测。

事务和嵌套事件

事务事件的父级是启动事务的事件。对于显式启动的事务,这包括 START TRANSACTIONCOMMIT AND CHAIN 语句。对于隐式启动的事务,它是先前事务结束后第一个使用事务引擎的语句。

通常,事务是事务期间启动的所有事件(包括显式结束事务的语句,例如 COMMITROLLBACK)的顶级父级。例外情况是隐式结束事务的语句,例如 DDL 语句,在这种情况下,必须在执行新语句之前提交当前事务。

事务和存储程序

事务和存储程序事件之间的关系如下所示。

  • 存储过程

    存储过程独立于事务运行。存储过程可以在事务内启动,并且可以在存储过程内启动或结束事务。如果从事务内调用,存储过程可以执行强制父事务提交的语句,然后启动新事务。

    如果在事务内启动存储过程,则该事务是存储过程事件的父级。

    如果由存储过程启动事务,则存储过程是事务事件的父级。

  • 存储函数

    存储函数被限制为不能导致显式或隐式提交或回滚。存储函数事件可以驻留在父事务事件内。

  • 触发器

    触发器作为访问与其关联的表的语句的一部分激活,因此触发器事件的父级始终是激活它的语句。

    触发器不能发出导致事务显式或隐式提交或回滚的语句。

  • 计划事件

    计划事件主体中的语句执行发生在新连接中。计划事件嵌套在父事务内不适用。

事务和保存点

保存点语句被记录为单独的语句事件。事务事件包括针对 SAVEPOINTROLLBACK TO SAVEPOINTRELEASE SAVEPOINT 语句的单独计数器,这些语句在事务期间发出。

事务和错误

事务内发生的错误和警告记录在语句事件中,而不是在相应的事务事件中。这包括特定于事务的错误和警告,例如非事务表的回滚或 GTID 一致性错误。