MySQL如何找出未提交事务信息

前阵子,我写了一篇博客“ORACLE中能否找到未提交事务的SQL语句”, 那么在MySQL数据库中,我们能否找出未提交事务执行的SQL语句或未提交事务的相关信息呢?

实验验证了一下,如果一个会话(连接)里面有一个未提交事务,然后不做任何操作,那么这个线程处于Sleep状态

mysql> select connection_id() from dual;
+-----------------+

| connection_id() |

+-----------------+

|               6 |

+-----------------+

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> 

在另外一个会话(连接)里面,查询这个超过10秒未提交事务的详细信息:

SELECT t.trx_mysql_thread_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 > 10 

       AND p.command = ‘Sleep‘\G 

如上截图所示,trx_query 为NULL值。基本上无法找到未提交事务的SQL语句,MySQL内部关于事务的信息不是很细,甚至可以说有点简洁。我甚至无法定位到在那个表上发生了锁。只能看到trx_row_locked、trx_row_modified、trx_started等信息。使用show engine innodb status也是如此,只能看到一些基本信息

mysql> show engine innodb status;

---TRANSACTION 1282583, ACTIVE 11937 sec

2 lock struct(s), heap size 360, 8 row lock(s), undo log entries 1

MySQL thread id 6, OS thread handle 0x7f8da2de3700, query id 190 localhost root

如果未提交的事务,阻塞了其它会话,那么有可能(仅仅是存在可能性,很多场景也不能找到位提交事务的相关SQL)找到未提交事务执行的SQL

如下测试所示,会话(连接 connection_id=11)中执行了delete操作,但是未提交事务

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

 

mysql> select connection_id();

+-----------------+

| connection_id() |

+-----------------+

|              11 |

+-----------------+

1 row in set (0.01 sec)

 

mysql> delete from kkk where id=1;

Query OK, 1 row affected (0.00 sec)

 

mysql> 

另外一个会话(连接)执行了一个更新记录的操作。此时SQL将被阻塞。

mysql> select connection_id();
+-----------------+

| connection_id() |

+-----------------+

|              13 |

+-----------------+

1 row in set (0.00 sec)

 

mysql> 

mysql> update kkk set id=100 where id=1;

我们在另外的会话中,执行下面SQL就可以查到未提交事务最后执行的SQL。

mysql> SELECT r.trx_id              waiting_trx_id, 
    ->        r.trx_mysql_thread_id waiting_thread, 

    ->        r.trx_query           waiting_query, 

    ->        b.trx_id              blocking_trx_id, 

    ->        b.trx_mysql_thread_id blocking_thread, 

    ->        b.trx_query           blocking_query 

    -> FROM   information_schema.innodb_lock_waits w 

    ->        INNER JOIN information_schema.innodb_trx b 

    ->                ON b.trx_id = w.blocking_trx_id 

    ->        INNER JOIN information_schema.innodb_trx r 

    ->                ON r.trx_id = w.requesting_trx_id; 

+----------------+----------------+----------------------------------+-----------------+-----------------+----------------+

| waiting_trx_id | waiting_thread | waiting_query                    | blocking_trx_id | blocking_thread | blocking_query |

+----------------+----------------+----------------------------------+-----------------+-----------------+----------------+

| 2830           |             13 | update kkk set id=100 where id=1 | 2825            |              11 | NULL           |

+----------------+----------------+----------------------------------+-----------------+-----------------+----------------+

1 row in set (0.00 sec)

 

mysql> SELECT a.sql_text, 

    ->        c.id, 

    ->        d.trx_started 

    -> FROM   performance_schema.events_statements_current a 

    ->        join performance_schema.threads b 

    ->          ON a.thread_id = b.thread_id 

    ->        join information_schema.processlist c 

    ->          ON b.processlist_id = c.id 

    ->        join information_schema.innodb_trx d 

    ->          ON c.id = d.trx_mysql_thread_id 

    -> where c.id=11

    -> ORDER  BY d.trx_started\G;

*************************** 1. row ***************************

   sql_text: delete from kkk where id =1

         id: 11

trx_started: 2019-06-12 23:36:13

1 row in set (0.03 sec)

 

ERROR: 

No query specified

 

mysql> 

总结:基本上MySQL只能找到未提交事务的基本信息,例如trx_mysql_thread_id等。某些场景下,我们几乎没有方法找出未提交事务执行的SQL等详细信息。搞不清未提交事务做了什么操作!

原文地址:https://www.cnblogs.com/kerrycode/p/11013479.html

时间: 2024-10-05 05:49:59

MySQL如何找出未提交事务信息的相关文章

找出未提交的MySQL线程/事务

找出未提交的MySQL线程/事务: SELECT trx_id,trx_state,trx_started,trx_mysql_thread_id,CURRENT_TIMESTAMP - trx_started AS RUN_TIME from information_schema.innodb_trx; SELECT * from information_schema.processlist;   这个能看到上面哪个SQL线程ID(下图的378号线程就是造成MDL锁的罪魁祸首) SELECT

找出数组中从未出现的最小正整数java实现

1 /** 2 * 找出未出现的最小正整数 3 * @param A 4 * @param n 5 * @date 2016-10-7 6 * @author shaobn 7 */ 8 public static int findArrayMex(int[] a,int n){ 9 int count = n; 10 int temp = 0; 11 int dir = 1; 12 int num = 0; 13 for(int i = 0;i<count-1;i++){ 14 if(a[i]

找出导致Mysql机器IO过高的SQL

近期一次mysql机器io过高导致入库缓慢,这里记录下解决和问题查找的过程. 首先通过top看到wa比较高,wa意思是CPU花在等待IO上的时间占比, 进而通过iostat -x 2看到如下图, rrqm/s:   每秒进行 merge 的读操作数目.即 delta(rmerge)/swrqm/s:  每秒进行 merge 的写操作数目.即 delta(wmerge)/sr/s:           每秒完成的读 I/O 设备次数.即 delta(rio)/sw/s:         每秒完成的

【c语言】在终端输入多行信息,找出包含&quot;ould&quot;的行,并打印改行

/* 在终端输入多行信息,找出包含"ould"的行,并打印改行. 如: Au,love could you and I with fate conspire To grasp this sorry scheme of things entire, Would not we shatter it to bitd - and then. 在终端输出上述的文字,输出 Au,love could you and I with fate conspire Would not we shatter

MySQL Transaction--查看未提交事务执行的SQL

未提交事务 长期未提交事务,指开启事务后,长时间未向MySQL发出SQL执行请求或事务处理(COMMIT/ROLLBACK)请求,在系统表`information_schema`.`INNODB_TRX` 中状态为RUNNING,而在`information_schema`.`PROCESSLIST`中状态为SlEEP. ## 查看未提交的事务(3秒内未操作的事务) SELECT p.ID AS conn_id, P.USER AS login_user, P.HOST AS login_hos

idea 高效找出全部未被使用的代码

不得不说 idea 真的很强大,认真花一些时间,好好研究研究 idea 可以让你编写代码更加的高效,并且 idea 时不时会给你一些惊喜的,比如今天要分享的这个,就非常的惊喜: 背景 前几天,忽然又一个朋友问了一个问题: idea 里面怎么找出全部未被使用的代码??? 我的第一反应是 idea 应该没有这个功能吧,但是我还是 Google 了下,的确发现有这个功能: 不得不说,stackoverflow 是一个神奇的网站: idea 具体操作 stackoverflow 具体地址如下: http

EXCEL的IF+MID函数结合找出班级信息

如下图所示,我们编号列,其中第3位第4位代表的所在的班级,01代表的是1班,02代表的是2班,03代表的是3班.我们通过EXCEL函数如何找到对应的班级呢.我们从上边分析知道3,4位代表是班级.所以我们要先找出3,4位,EXCEL中提供了MID函数就是专门查找字符串指定位置的字符进行截取,下边是该函数语法MID(查找的字符串,查找字符串开始的位置,需要字符串个数)我们根据这个可以写出公式MID(C3,3,2),最后返回结果就是01,那么EXCEL函数就解决了第一个问题.找到了代表班级的编号了.下

03 找出性能问题

本章提要------------------------------------------------------如何找出性能问题的办法, 分而治之跟踪SQLTKPROF工具------------------------------------------------------3.1 分而治之    开发基于数据库(类似oracle)的应用程序, 当前的多层架构已经是既定事实, 一般用 MVC, 例如:部署一个web应用, 以下组件, 多数    运行在多台机器上.    客户端-反向代理

找出真凶:谁在连接我的数据库?

qunyingliu 2014.10.31 背景: 数据库迁移需要梳理数据库认证信息,业务的数据库配置信息比较松散,已知的已经修改但是总有一些落单的. 怎么找出真凶? 1.登录数据库服务器查看连接数据库的网络链接: ssh   10.1.1.85 netstat -ntp|grep "数据库IP:数据库端口" 查看数据库服务器上已经建立的连接,如下图所示: tcp   0  0  10.1.1.85:3306    10.2.1.33:3610   ESTABLISHED 13025/