Mysql-死锁排查与解决

导致mysql 死锁的四个条件:

1、互斥条件:就是一个资源只能有一个进程占有,不可以被两个或者多个进程占有

 

2、不可抢占条件:进程已经获得的资源在未使用完之前,不可以被抢占,只能在使用完之后自己释放

 

3、占有申请条件:进程自己已经至少保持一个资源,又请求其他资源,但是这个资源被其他进程占有,而且又不释放自己已经占有的资源

 

4、循环等待条件:发生死锁时,必定会形成一个进程——资源的环路。进程集合{p1p2p3}中,p1请求p2占有的资源,p2请求p3占有的资源,p3请求p1占有的资源


解决死锁的方案

第一种:

1.查询是否锁表

show OPEN TABLES where In_use > 0;

 

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

show full processlist;

 

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

kill 进程id


第二种:

1.查看下在锁的事务

SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

 

2.杀死进程id(就是上面命令的trx_mysql_thread_id

kill 进程id


分析:

1、查看数据库的隔离级别(一般是RRREPEATABLE-READ):

mysql> select @@tx_isolation;

mysql> select @@global.tx_isolation;

 

2innodb引擎的状态---会有死锁信息(MyISAM存储引擎没有死锁的说法)

mysql> SHOW ENGINE INNODB STATUS;

3mysql都是autocommit,不会出现update卡住的情况,去查看下autocommit的值

mysql> select @@autocommit;

1表示自动提交。0表示不自动提交。

如果你发现自己的数据库autocommit=0,将它改正。

猜你喜欢

转载自blog.51cto.com/9625010/2486571
今日推荐