数据库(mysql)锁查询,杀灭死锁进程教程

假如数据发生死锁,导致数据库表无法更新、插入、删除,业务流程无法进行,你知道该如何查询锁信息,死锁信息,然后杀灭死锁进程吗?
TART TRANSACTION;
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
select * from ck_allot_task t WHERE t.id = 12 for update;
COMMITED;
ROLLBACK;
用navicat或者其他工具,或者数据库terminal命令窗口,打开两个两个会话,然后分别执行上述命令,因为排它锁的存在,会出现锁等待,如果要复现死锁,则可以用两个会话分别执行:
where id = "不存在的id" for update;
insert id(接近 for update 的id)
这里只讲怎么查询锁信息,就不做展开了。
查询InnoDB锁信息
InnoDB存储引擎提供了更详细的锁信息查询,可以通过information_schema库中的视图来查看:
-
查看当前锁的持有者和等待者
SELECT * FROM information_schema.INNODB_TRX;


这个命令可以展示当前运行的事务信息,包括事务ID、状态、是否锁定了表等。
-
查看InnoDB锁的详细情况
SELECT * FROM information_schema.INNODB_LOCKS;

这个命令展示了当前的锁信息,包括锁的类型、空间ID、页面号、索引记录等,帮助你理解哪些锁正在被持有以及哪些请求正在等待。
-
查看被锁定的事务
SELECT * FROM information_schema.INNODB_LOCK_WAITS;
此命令可以显示锁等待的详细信息,包括请求锁的事务ID和被等待的事务ID,以及涉及的锁和索引等。

-
查询该数据库服务器所有的进程
SHOW PROCESSLIST;

查询所有的进程信息,其中带IP地址,还有执行的语句:
查看表锁定情况
-
查看表锁定情况
若要直接查看哪些表被锁定,可以使用如下命令:
SHOW OPEN TABLES WHERE In_Use > 0;
这个命令会列出所有当前被锁定的表及其被锁定的数量。
-
全局锁状态查询
虽然不常用,但如果你想查看全局锁的状态,可以尝试(注意,全局锁主要通过FLUSH TABLES WITH READ LOCK命令施加):
SHOW GLOBAL STATUS LIKE 'Flush_tables_%';
-
查看当前会话的锁信息
SHOW ENGINE INNODB STATUS;
以下是一个描述查看MVSQL锁信息的示例序列图:

以下是一个描述锁类型分布的示例饼状图:

后面我还会出一篇,关于实际开发过程中,所遇到的死锁出现的场景,比如:主键(或唯一键)键冲突,失败的insert变成共享锁,导致死锁,如何排查,如何解决、优化的博文。
觉得我的文章对对你有帮助的话,关注下我吧,还有好多免费最新开发版本的开发工具分享:

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)