Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > Mysql死锁和解除锁

Mysql关于进程中的死锁和解除锁问题

作者:从未完美过

Mysql 经常会遇到语句或者存储过程长时间没有反应,大概率就是挂掉了,或者死锁了,这篇文章主要介绍了Mysql关于进程中的死锁和解除锁问题,本文给大家介绍的非常详细,需要的朋友可以参考下

什么是死锁

死锁是2+个线程在执行过程中, 因争夺资源而造成的相互等待的现象,若无外力作用,它们将无法推进下去。

死锁产生的4个必要条件

互斥条件

指进程对所分配的资源进行排他性使用,即一段时间内某资源只有一个进程占用,其他的进程请求资源只能等待,直至被占有资源的进程得到释放。

请求和保留条件

指进程至少保持占用一个资源,但又提出新的资源请求,而该资源正被其他进程占用,此时请求进程阻塞,但对以获得的其他资源保持不放。

不剥夺条件

指进程已获得的资源,在未使用完之前,不能剥夺,只能使用完时由自己释放。

环路等待条件

值发生死锁时,必然存在一个进程占用资源的环形链,即进程集合(P0,P1,P2, … Pn),P0等待P1资源释放,P1等待P2资源释放,P3等待 … Pn等待P0资源释放。
对应到mysql中存在的互斥锁,和事务对资源使用排他锁占用,并且事务不结束不会释放,事务之间可会出现资源之间的相互占用,相互等待,因此看来,mysql中是会出现死锁的。

Mysql关于进程中的死锁和解除锁

Mysql 经常会遇到语句或者存储过程长时间没有反应,大概率就是挂掉了,或者死锁了。

可通过如下几种方式来查看当前进程状态

1. 查询数据库所有的进程状态

SHOW PROCESSLIST
SELECT * FROM information_schema.PROCESSLIST;

2. 查询在锁的事务

SELECT * FROM information_schema.INNODB_TRX;

3. 查看是否锁表

show OPEN TABLES where In_use > 0;

4. 观察事务内锁状态

show engine innodb status

 status 里面就有对应的结果,具体结果可以搜索了。

最后,杀死进程

查询到上面的进程id,可以用如下命令结束进程

KILL 进程id

KILL  38233

到此这篇关于Mysql关于进程中的死锁和解除锁的文章就介绍到这了,更多相关Mysql死锁和解除锁内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文