赶紧跑过去一通处理,解决完以后,突然感觉自己已经太久没有遇到死锁的问题了,所以借此机会正好回顾一下MySQL死锁的相关知识点。
一,MySQL死锁有哪些种类?
按照锁定机制可分为:表级锁定,行级锁定,页级锁定。
二,数据库产生死锁的原因?
死锁指的是两个或者两个以上的进程在执行过程中,因为争夺资源而造成的一种互相等待的现象。这个时候如果没有外力作用,系统就会一直处于死锁的状态,并且堵塞后续操作。
就好像两个面对面过独木桥的人,你需要等我过去才能往前走,我也需要等你过去之后才能往前走,谁也不肯让谁,导致一直堵在中间。并且因为他们两个堵在中间,一直占用了这个独木桥,导致后续需要过独木桥的人也无法通过。
三,死锁和锁冲突有什么区别?
1:死锁(多个进程互相等待对方锁的释放)。
2:锁冲突(一个进程等待另一个进程释放需要的锁)。
四,常见的数据库死锁案例。
案例1:有人在查询这张表的时候,同时另一个人在设计这张表,这种情况会导致这张表被锁住,一般称为表级锁。
案例2:有人在Updating这张表的时候,同时有人在Select这张表,如果有这两个语句有作用相同的行,就会出现行级锁。
五,遇到死锁应该怎样处理?
1:首先可以初步分析自己遇到的是什么样的死锁?具体是因为什么原因导致的死锁?
2:使用 SHOW PROCESSLIST; 命令查看具体有哪些死锁进程。一般State字段带lock字眼都是死锁进程。
3:结合具体情况分析后,可以使用 KILL 命令强制 KILL 掉死锁进程。一般都是从上往下 KILL ,但是具体情况具体处理,需要自己把关先KILL那个后KILL那个。
4:直到使用 SHOW PROCESSLIST; 命令查看不再有死锁进程,说明死锁已经被强制释放,这个时候表应该也可以正常打开了。
5:虽然通过 KILL 命令强制释放了死锁的问题,但是我们应该追根筑底,通过分析日志,排查代码等找到具体产生死锁的原因,然后通过制定规则,避免下次再产生死锁的问题。
6:如果 KILL 完死锁进程后,弹出“2013 lost connection to mysql server during query”,说明已经丢失了和MySQL服务的连接,这个时候我们需要重启一下MySQL服务。