transacton tables - xiaoboluo768/mysql-system-schema GitHub Wiki

  • 事务事件存储在如下一些表中:

    • events_transactions_current:当前事务事件表
    • events_transactions_history:每个线程最近的事务事件表
    • events_transactions_history_long:全局最新的事务事件表(跨所有线程)
    • 对于事务事件汇总表,见后续章节
  • 事务事件相关配置中,setup_instruments表中只有一个名为transaction的instrument,默认关闭,setup_consumers表中transactions相关的consumers配置默认关闭了,setup_timers表中默认配置的计时器单位为NANOSECOND

  • 事务边界相关知识

    • 在MySQL Server中,显示开启一个事务的语句有:START TRANSACTION、BEGIN 、XA START、XA BEGIN
    • 事务也可以隐式开启。例如:当启用autocommit=1系统变量时,每个针对事务引擎的语句都会隐式启动一个新的事务
    • 当禁用自动提交时,提交了上一个事务之后,针对事务引擎执行的第一个语句标志着一个新事务的开启。在遇到显式或隐式提交语句之前所执行的所有语句都属于这个新事务的一部分
    • 事务显式提交的语句有:COMMIT、ROLLBACK、XA COMMIT、XA ROLLBACK
    • 触发事务隐式提交的语句有:DDL语句,lock相关的语句、server管理语句、使用显式启动事务的语句在一个事务内开启一个新事务
    • 注意:以下对START TRANSACTION的相关说明和引用也适用于BEGIN,XA START和XA BEGIN。对COMMIT和ROLLBACK的相关说明和引用也适用于XA COMMIT和XA ROLLBACK语句,下面就不一一举例
    • performance_schema中定义事务的边界与server中定义事务边界类似。事务事件的开始和结束与server中的相应状态转换紧密匹配:
      • 对于显式启动的事务,事务事件在执行START TRANSACTION语句时启动
      • 对于隐式启动的事务,事务事件将在上一个事务结束之后,针对事务引擎表的第一个语句执行时启动
      • 对于任何事务,无论是显式还是隐式结束(注意这里指的是在存储引擎层真正提交,不是指的commit语句),当server在对一个事务执行commit或rollback语句期间,事务状态从活跃切换到其他状态时,事务事件就结束了
    • 对这种方法有微妙的影响:
      • performance_schema中的事务事件并不完全包含与之关联的START TRANSACTION,COMMIT或ROLLBACK语句事件信息。事务事件和这些语句事件之间的时间有少量重叠
      • 事务引擎与非事务引擎的语句在同一个事务中一起使用时,对事务的状态没有影响。在事务中执行非事务引擎表相关的语句时,在事务事件的相关信息收集时会被忽略
      • 示例:(对于server来说,事务1在创建表t2时结束。事务2直到访问事务表t1时才开始,在t1表访问前对非事务性表t2执行了INSERT和UPDATE操作会被忽略。对于performance_schema来说,事务2在server切换为活动事务状态时启动(对t1表插入4,5,6值那个事务)。语句6和7不包括在事务2内(因为这个是针对非事务表的操作,会被事务2忽略),这与server中将事务写入二进制日志的方式是一致的(在一个事务内,未提交之前,非事务引擎的DML语句会立即记录到binlog中,而事务引擎的DML语句需要在事务提交之后才会记录到binlog中):
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
  • 事务采集

    • 事务的三个属性:
      • 访问模式(只读,读写)
      • 隔离级别(SERIALIZABLE,REPEATABLE READ等)
      • 提交模式:隐式(启用自动提交)或显式(禁用自动提交)
    • 为了降低事务instruments的复杂性,并确保收集的事务事件数据提供完整、有意义的,所有事务事件的收集都将独立于访问模式、隔离级别、提交模式
    • 可以通过各种方式减少事务收集的开销,例如根据用户,帐户,主机或线程(客户端连接)启用或禁用事务检测。
  • 嵌套事务和嵌套事件

    • 事务事件的父事件就是启动该事务的事件。显式启动的事务包括使用语句:START TRANSACTION、COMMIT AND CHAIN、BEGIN语句开始的事务,隐式启动的事务指的在上一个事务结束之后对事务引擎执行的第一个语句,这第一个语句会启动一个隐式事务
    • 通常,事务事件是在这个事务执行期间所有事件的顶级父级事件,包含显式提交事务的语句事件,如COMMIT和ROLLBACK。但是排除隐式提交事务的语句事件,例如DDL语句,在这种情况下,必须在执行新语句之前先提交当前事务
  • 事务和存储程序

    • 事务和存储程序相关的事件:
    • 存储过程
      • 存储过程独立于事务操作。存储过程可以在事务中启动,而事务也可以在存储过程中启动和提交,如果在事务中调用存储过程,则存储过程会强制提交父事务并启动一个新的事务(就如同在一个显式事务没有提交之前,在事务内新启动一个事务时,会强制提交前一个事务类似)
      • 如果存储过程在事务中启动,则该事务是存储过程事件的父事件
      • 如果事务在存储过程启动,则存储过程是事务事件的父事件
    • 存储函数
      • 存储函授会受到限制,不会导致显式或隐式的事务提交或回滚。存储函数事件可以驻留在父级事务事件中
    • 触发器
      • 触发器是作为对与之关联的表被某语句访问时那个语句的一部分(因为触发器一定是在某个语句在访问与它关联的表时触发的),因此触发事件的父事件始终是激活它的语句事件
      • 触发器不能执行显式或隐式启动、提交事务的语句
    • 调度事件
      • 调度事件中的语句是在一个新的连接中执行的,所以对于调度事件来讲,事务事件不会成为调度事件的父事件,因为调度事件不可能被一个事务启动
  • 事务和保存点

    • Savepoint语句作为单独的语句事件进行记录。事务事件信息中包括SAVEPOINT相关的计数器,在事务执行期间使用ROLLBACK TO SAVEPOINT和RELEASE SAVEPOINT语句会被记录在事务事件中
  • 事务和错误信息

    • 事务执行期间发生的错误和警告会被记录在语句事件信息中而不会记录在对应的事务事件信息中。包括针对事务的错误和警告,例如对非事务性表执行回滚或GTID一致性语句时的错误
  • PS:对于显式(外部)xa事务,必须要经过如下几个步骤

    • xa start 'name';
    • [exec statements];
    • xa end 'name';
    • xa prepare 'name';
    • xa commit 'name';
  • 参考链接:https://dev.mysql.com/doc/refman/5.7/en/performance-schema-transaction-tables.html


上一篇: prepared_statements_instances表 | 下一篇: events_transactions_current表