当项目中存在公共的数据表,比如日志表,同时存在对这张表的读写操作,或者是对数据量较大的表加索引同时伴随其他并发操作,那么这张表就有较高概率发生死锁。
现象:对于这张表的任何操作都会被阻塞,项目出现大量的超时报错。
具体解决:
使用 SHOW PROCESSLIST;
命令的输出结果显示了有哪些线程在运行,可以帮助识别出有问题的查询语句,一般死锁的线程都会在查询结果的state字段中 又lock这个标记,如图所示
然后kill 进程号;来杀死死锁进程
SHOW PROCESSLIST;kill 369126;
kill 369129;
kill 369133;
kill 369139;
kill 369140;
kill 369141;
kill 369143;
kill 369145;
kill 369146;
kill 369152;
MySQL表死锁会导致无法查询这张表。当发生死锁时,MySQL会自动检测到死锁的存在,并根据事务的优先级自动进行回滚操作。这样一来,死锁事务中的查询语句会被终止执行,整个事务会被回滚到之前的状态。因此,死锁会导致无法查询这张表,直到死锁被解决。
死锁的检测和解决
- 检测死锁:可以通过查询进程列表来检测是否存在死锁。使用命令
SHOW PROCESSLIST;
可以查看当前所有进程的信息,找到可能导致死锁的进程。 - 解决死锁:一旦检测到死锁,可以通过杀死导致死锁的进程来解决问题。使用命令
KILL [进程ID];
可以终止特定的进程,从而解除死锁。
预防死锁的策略
- 合理设计索引:确保索引的设计能够减少锁的竞争,避免不必要的全表扫描。
- 优化事务设计:尽量减少事务的持续时间,避免长时间持有锁。
- 使用锁超时设置:通过设置锁的超时时间,避免长时间等待锁的释放。
- 避免大事务:将大事务拆分成多个小事务,减少锁定资源的时间和范围。