首先我们创建一个测试表:
会话 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 定位加锁 SQL
select *
from performance_schema.events_statements_current
where thread_id=63G
结果中我们找到了加锁的 update 的 SQL 语句。
页面更新:2024-06-04
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号