mysql 根据事务id 查找 sql_MySQL如何找出未提交事务的SQL浅析

本文重新探讨了如何在MySQL中找出未提交事务的SQL信息,详细介绍了通过性能模式和系统表来定位事务执行的SQL语句。分析了由于TIMER_START字段的波动和偏差可能带来的查询问题,并提供了相应的解决思路和优化后的SQL查询方法。
摘要由CSDN通过智能技术生成

  很久之前曾经总结过一篇博客“MySQL如何找出未提交事务信息”,现在看来,这篇文章中不少知识点或观点都略显肤浅,或者说不够深入,甚至说部分结论是错误的。下面重新探讨一下这个话题。那么我们还是以之前的例子来介绍。

--准备测试环境数据(实验环境为MySQL 8.0.18社区版)

mysql> create table kkk(id int , name varchar(12));
Query OK, 0 rows affected (0.34 sec)

mysql> insert into kkk values(1, 'kerry');
Query OK, 1 row affected (0.01 sec)

mysql> insert into kkk values(2, 'jerry');
Query OK, 1 row affected (0.00 sec)

mysql> insert into kkk values(3, 'ken');
Query OK, 1 row affected (0.00 sec)

mysql> 

mysql> create table t(a   varchar(10));
Query OK, 0 rows affected (0.47 sec)

mysql> insert into t values('test');
Query OK, 1 row affected (0.00 sec)

在一个会话窗口(连接ID=38)执行下面SQL

mysql> select connection_id() from dual;
+-----------------+
| connection_id() |
+-----------------+
|              38 |
+-----------------+
1 row in set (0.00 sec)

mysql> set session autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql>  delete from kkk where id =1;
Query OK, 1 row affected (0.00 sec)

mysql> 

在另外一个会话窗口(连接ID=39)执行下面SQL

mysql> SELECT t.trx_mysql_thread_id
    ->   ,t.trx_id
    ->       ,t.trx_state
    ->       ,t.trx_tables_in_use
    ->       ,t.trx_tables_locked
    ->       ,t.trx_query
    ->       ,t.trx_rows_locked 
    ->       ,t.trx_rows_modified
    ->       ,t.trx_lock_structs
    ->       ,t.trx_started
    ->       ,t.trx_isolation_level
    ->       ,p.time 
    ->       ,p.user
    ->       ,p.host
    ->       ,p.db
    ->       ,p.command
    -> FROM   information_schema.innodb_trx t 
    ->        INNER JOIN information_schema.processlist p 
    ->                ON t.trx_mysql_thread_id = p.id 
    -> WHERE  t.trx_state = 'RUNNING' 
    ->        AND p.time > 4 
    ->        AND p.command = 'Sleep'\G 
*************************** 1. row ***************************
trx_mysql_thread_id: 38
             trx_id: 7981581
          trx_state: RUNNING
  trx_tables_in_use: 0
  trx_tables_locked: 1
          trx_query: NULL
    trx_rows_locked: 4
  trx_rows_modified: 1
   trx_lock_structs: 2
        trx_started: 2020-12-03 15:39:37
trx_isolation_level: REPEATABLE READ
               time: 23
               user: root
               host: localhost
                 db: MyDB
            command: Sleep
1 row in set (0.00 sec)

虽然上面这个SQL找不出事务执行过的SQL,其实呢,MySQL中未提交事务的最后执行的一个SQL是可以通过下面脚本准确查找出来的。如下所示:

SELECT t.trx_mysql_thread_id                        AS connection_id
      ,t.trx_id                                     AS trx_id          
      ,t.trx_state                                  AS trx_state        
      ,t.trx_started                                AS trx_started     
      ,TIMESTAMPDIFF(SECOND,t.trx_started, now())   AS "trx_run_time(s)"  
      ,t.trx_requested_lock_id                      AS trx_requested_lock_id
      ,t.trx_operation_state                        AS trx_operation_state
      ,t.trx_tables_in_use                          AS trx_tables_in_use
      ,t.trx_tables_locked                          AS trx_tables_locked
      ,t.trx_rows_locked                            AS trx_rows_locked
      ,t.trx_isolation_level                        AS trx_isolation_level
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值