记录一次Mysql死锁排查事件

Navicat 修改表 卡死 Mysql 死锁了

我:咔咔写代码,然后IDEA正在debug…这个时候,我的debug还没结束!
同事(大佬)过来我这边讨论表结构。
表示礼貌,我停下了手中的debug,跟他讨论了起来,经过许久的讨论,需要修改表(加几个字段)。

在同事的协助下,打开navicat,修改表AAAA 。加上了新增的字段,点击保存。就卡死了。
以为是navicat卡了,或者是电脑卡了。任务管理器关掉navicat,重新修改保存(还好字段不多QAQ)。咦??怎么又卡死了,鼠标一直转圈圈。
What?黑人问号???????

这个时候,意识到应该是mysql被锁死了!

那么,百度如何解除死锁:

得到下面的结果

解除Mysql正在死锁的状态有两种方法:
第一种:
1.查询是否锁表

show OPEN TABLES where In_use > 0;

2.查询进程(如果您有SUPER权限,您可以看到所有线程。否则,您只能看到您自己的线程)

show processlist

3.杀死进程id(就是上面命令的id列)

kill id

navicat控制台执行show processlist,发现确实有进程被锁了。我们心想kill掉这个进程就好了。
呵呵~杀掉了锁住的进程也没用。

突然,灵光一现,我在debug。这个方法里面,恰好就对表AAAA进行了查询(query)操作,mysql是关系型数据库,代码里面加了事务。那么,在整个方法没有执行完之前,对这张表是加了锁的。这个时候,去修改这张表的字段,当然是不允许的!

结束debug,再修改表,就OK了。

最后,推荐读的一本书。
非常之六批的一本书 — 《深入理解计算机系统(原书第三版)》
有时间了一定要去浅读一下。

你可能感兴趣的:(Mysql)