|  在技术加营销的道路上越走越远
温馨提示
我是弹窗内容
当前位置:首页 > 后端技能提升 > 遇到死锁应该怎样处理?回顾一下MySQL死锁的知识点
遇到死锁应该怎样处理?回顾一下MySQL死锁的知识点

遇到死锁应该怎样处理?回顾一下MySQL死锁的知识点

日期:2021-11-29 浏览量:1029 原创作者:湖八爷
刚刚一个同事火急火燎的跑过来问我,说他接手的一个客户,现在系统出现了500错误,然后他用Navicat操作数据库,想打开某张表查看的时候发现这个表一直打不开,而且无法关闭,但是操作其它表却没有任何问题,所以他判断应该是数据库表死锁了,问我应该怎么解决?

赶紧跑过去一通处理,解决完以后,突然感觉自己已经太久没有遇到死锁的问题了,所以借此机会正好回顾一下MySQL死锁的相关知识点。



一,MySQL死锁有哪些种类?

按照锁定机制可分为:表级锁定行级锁定页级锁定


各存储引擎支持锁的种类.png



二,数据库产生死锁的原因?

死锁指的是两个或者两个以上的进程在执行过程中,因为争夺资源而造成的一种互相等待的现象。这个时候如果没有外力作用,系统就会一直处于死锁的状态,并且堵塞后续操作。


就好像两个面对面过独木桥的人,你需要等我过去才能往前走,我也需要等你过去之后才能往前走,谁也不肯让谁,导致一直堵在中间。并且因为他们两个堵在中间,一直占用了这个独木桥,导致后续需要过独木桥的人也无法通过。



三,死锁和锁冲突有什么区别?

1:死锁(多个进程互相等待对方锁的释放)。

2:锁冲突(一个进程等待另一个进程释放需要的锁)。



四,常见的数据库死锁案例。

案例1:有人在查询这张表的时候,同时另一个人在设计这张表,这种情况会导致这张表被锁住,一般称为表级锁。


案例2:有人在Updating这张表的时候,同时有人在Select这张表,如果有这两个语句有作用相同的行,就会出现行级锁。



五,遇到死锁应该怎样处理?

1:首先可以初步分析自己遇到的是什么样的死锁?具体是因为什么原因导致的死锁?


2:使用 SHOW PROCESSLIST; 命令查看具体有哪些死锁进程。一般State字段带lock字眼都是死锁进程。


SHOW PROCESSLIST; 命令查看具体有哪些死锁进程.png


3:结合具体情况分析后,可以使用 KILL 命令强制 KILL 掉死锁进程。一般都是从上往下 KILL ,但是具体情况具体处理,需要自己把关先KILL那个后KILL那个。


4:直到使用 SHOW PROCESSLIST; 命令查看不再有死锁进程,说明死锁已经被强制释放,这个时候表应该也可以正常打开了。


5:虽然通过 KILL 命令强制释放了死锁的问题,但是我们应该追根筑底,通过分析日志,排查代码等找到具体产生死锁的原因,然后通过制定规则,避免下次再产生死锁的问题。


6:如果 KILL 完死锁进程后,弹出“2013 lost connection to mysql server during query”,说明已经丢失了和MySQL服务的连接,这个时候我们需要重启一下MySQL服务。