快速定位加锁的SQL
首先我们创建一个测试表:
创建测试表
会话 1,开启事务,更新 id=1 的数据:
会话 2,开启另一个事务,删除 id=1 的数据:
此时会话 2 被锁定,出现锁等待。
我们再开一个会话 3,查查当前的 processlist,看看是否能发现什么?
我们可以看到 delete 这个 SQL 的进程在执行中,并没有发现其他有价值的内容,那锁在哪里了。接下来的步骤带你一步步的定位出加锁的 SQL。
## 1 定位锁等待select * from information_schema.innodb_lock_waits;
定位锁等待
结果显示有一个锁等待。
## 2 定位锁select * from information_schema.innodb_locks;
定位锁
结果显示有两个锁相关内容。
## 3 定位事务select trx_id , trx_started , trx_requested_lock_id , trx_query , trx_mysql_thread_id from information_schema.innodb_trx;
定位事务
结果有两个事务,MySQL 事务线程 id 为 38 和 41,很直观的看到 41 是我们的 delete 事务,被 38 锁定。
## 4 定位线程select * from performance_schema.threads where processlist_id=38G
定位线程
结果找到 MySQL 事务线程 38 对应的服务器线程 63。
## 5 定位加锁 SQLselect * from performance_schema.events_statements_current where thread_id=63G
定位加锁SQL
结果中我们找到了加锁的 update 的 SQL 语句。