235e393332ac4536bdd8171b5ac0275e.jpeg

     

        假如数据发生死锁,导致数据库表无法更新、插入、删除,业务流程无法进行,你知道该如何查询锁信息,死锁信息,然后杀灭死锁进程吗?

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;

 

791d640924afe72c333cd2b0a62c6a0c.jpeg

 

8a83c018ba1e4bf091ae4fbbff1a33fe.png

这个命令可以展示当前运行的事务信息,包括事务ID、状态、是否锁定了表等。

  • 查看InnoDB锁的详细情况

SELECT * FROM information_schema.INNODB_LOCKS;

 

ddd0cc4ae081b6855f41c4be3e24d496.png

这个命令展示了当前的锁信息,包括锁的类型、空间ID、页面号、索引记录等,帮助你理解哪些锁正在被持有以及哪些请求正在等待。

  • 查看被锁定的事务

SELECT * FROM information_schema.INNODB_LOCK_WAITS;

此命令可以显示锁等待的详细信息,包括请求锁的事务ID和被等待的事务ID,以及涉及的锁和索引等。

 

a3da39a692e6d1c99122cc356e26e29c.png

  • 查询该数据库服务器所有的进程

SHOW PROCESSLIST;

 

1d1e8f932c4b6b83b46051b212a72184.png

查询所有的进程信息,其中带IP地址,还有执行的语句:

查看表锁定情况

  • 查看表锁定情况

若要直接查看哪些表被锁定,可以使用如下命令:

SHOW OPEN TABLES WHERE In_Use > 0;

这个命令会列出所有当前被锁定的表及其被锁定的数量。

  • 全局锁状态查询

虽然不常用,但如果你想查看全局锁的状态,可以尝试(注意,全局锁主要通过FLUSH TABLES WITH READ LOCK命令施加):

SHOW GLOBAL STATUS LIKE 'Flush_tables_%';
  • 查看当前会话的锁信息

SHOW ENGINE INNODB STATUS;

以下是一个描述查看MVSQL锁信息的示例序列图:

 

7732e1f948886dbf5caf723c20ac63b9.png

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

 

e2cab6d0f34b35c23ba290ed1b1f31a6.png

        后面我还会出一篇,关于实际开发过程中,所遇到的死锁出现的场景,比如:主键(或唯一键)键冲突,失败的insert变成共享锁,导致死锁,如何排查,如何解决、优化的博文。

        觉得我的文章对对你有帮助的话,关注下我吧,还有好多免费最新开发版本的开发工具分享:

9abad075c259466da26e7ee197a0f56d.jpeg

 

Logo

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

更多推荐