快速定位加锁的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 定位加锁 SQL

select *
from performance_schema.events_statements_current
where thread_id=63G

定位加锁SQL

结果中我们找到了加锁的 update 的 SQL 语句。

展开阅读全文

页面更新:2024-06-04

标签:加锁   线程   直观   语句   进程   步骤   事务   快速   发现   测试   数据

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top