引发这个现象大致分两类原因
第1类:
开发程序在事务设计时,没有正常提交导致的。显示启动一个事务后,innodb_trx会记录到事务信息,但是由于该事务包含的所有sql已经执行完成,所以看不见正在运行的SQL。
解决思路:根据mysql两阶段锁协议,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放, 而是要等到事务结束时才释放。所以你可以看到了锁了544条记录的信息。针对这类问题,建议dba直接杀掉事务。
第2类:
程序在运行一个非常大的事务,例如for循环1亿次等,事务一直在运行中,只是因为每次执行的sql非常小。DBA每次查看innodb_trx的时刻很难捕捉到正在运行的SQL。
针对上面的现象,虽然当前没有运行的SQL,但是我们可以以下SQL查看到该事务的上一条运行的sql。
select trx_id,trx_operation_state,trx_mysql_thread_id prs_id,now(),
trx_started,to_seconds(now())-to_seconds(trx_started) trx_es_time,
user,db,host,command,state,Time,info current_sql,PROCESSLIST_INFO
last_sql,t4.ROWS_AFFECTED 'ROWS_AFFECTED(last)',t4.ROWS_SENT as 'ROWS_SENT(last)'
,t4.ROWS_EXAMINED as 'ROWS_EXAMINED(last)',t1.trx_rows_locked,t1.trx_rows_modified
from information_schema.innodb_trx t1,information_schema.processlist t2,performance_schema.threads
t3,performance_schema.events_statements_current t4 where t1.trx_mysql_thread_id=t2.id and
t1.trx_mysql_thread_id=t3.PROCESSLIST_ID and t1.trx_mysql_thread_id!=connection_id() and
t3.THREAD_ID = t4.THREAD_ID and to_seconds(now())-to_seconds(trx_started) >= 5;