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,將它改正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章