怎么在MySQL中找出未提交的事务信息
本篇文章给大家分享的是有关怎么在MySQL中找出未提交的事务信息,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
mysql>selectconnection_id()fromdual;+-----------------+|connection_id()|+-----------------+|6|+-----------------+1rowinset(0.00sec)mysql>setsessionautocommit=0;QueryOK,0rowsaffected(0.00sec)mysql>deletefromkkkwhereid=1;QueryOK,1rowaffected(0.00sec)mysql>
在另外一个会话(连接)里面,查询这个超过10秒未提交事务的详细信息:
SELECTt.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.commandFROMinformation_schema.innodb_trxtINNERJOINinformation_schema.processlistpONt.trx_mysql_thread_id=p.idWHEREt.trx_state='RUNNING'ANDp.time>10ANDp.command='Sleep'\G
如上截图所示,trx_query 为NULL值。基本上无法找到未提交事务的SQL语句,MySQL内部关于事务的信息不是很细,甚至可以说有点简洁。我甚至无法定位到在那个表上发生了锁。只能看到trx_row_locked、trx_row_modified、trx_started等信息。使用show engine innodb status
也是如此,只能看到一些基本信息
mysql>showengineinnodbstatus;---TRANSACTION1282583,ACTIVE11937sec2lockstruct(s),heapsize360,8rowlock(s),undologentries1MySQLthreadid6,OSthreadhandle0x7f8da2de3700,queryid190localhostroot
如果未提交的事务,阻塞了其它会话,那么有可能(仅仅是存在可能性,很多场景也不能找到位提交事务的相关SQL)找到未提交事务执行的SQL
如下测试所示,会话(连接 connection_id=11
)中执行了delete操作,但是未提交事务
mysql>setsessionautocommit=0;QueryOK,0rowsaffected(0.00sec)mysql>selectconnection_id();+-----------------+|connection_id()|+-----------------+|11|+-----------------+1rowinset(0.01sec)mysql>deletefromkkkwhereid=1;QueryOK,1rowaffected(0.00sec)mysql>
另外一个会话(连接)执行了一个更新记录的操作。此时SQL将被阻塞。
mysql>selectconnection_id();+-----------------+|connection_id()|+-----------------+|13|+-----------------+1rowinset(0.00sec)mysql>mysql>updatekkksetid=100whereid=1;
我们在另外的会话中,执行下面SQL就可以查到未提交事务最后执行的SQL。
mysql>SELECTr.trx_idwaiting_trx_id,->r.trx_mysql_thread_idwaiting_thread,->r.trx_querywaiting_query,->b.trx_idblocking_trx_id,->b.trx_mysql_thread_idblocking_thread,->b.trx_queryblocking_query->FROMinformation_schema.innodb_lock_waitsw->INNERJOINinformation_schema.innodb_trxb->ONb.trx_id=w.blocking_trx_id->INNERJOINinformation_schema.innodb_trxr->ONr.trx_id=w.requesting_trx_id;+----------------+----------------+----------------------------------+-----------------+-----------------+----------------+|waiting_trx_id|waiting_thread|waiting_query|blocking_trx_id|blocking_thread|blocking_query|+----------------+----------------+----------------------------------+-----------------+-----------------+----------------+|2830|13|updatekkksetid=100whereid=1|2825|11|NULL|+----------------+----------------+----------------------------------+-----------------+-----------------+----------------+1rowinset(0.00sec)mysql>SELECTa.sql_text,->c.id,->d.trx_started->FROMperformance_schema.events_statements_currenta->joinperformance_schema.threadsb->ONa.thread_id=b.thread_id->joininformation_schema.processlistc->ONb.processlist_id=c.id->joininformation_schema.innodb_trxd->ONc.id=d.trx_mysql_thread_id->wherec.id=11->ORDERBYd.trx_started\G;***************************1.row***************************sql_text:deletefromkkkwhereid=1id:11trx_started:2019-06-1223:36:131rowinset(0.03sec)ERROR:Noqueryspecifiedmysql>
以上就是怎么在MySQL中找出未提交的事务信息,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。