導致mysql 死鎖的四個條件:
1、互斥條件:就是一個資源只能有一個進程佔有,不可以被兩個或者多個進程佔有
2、不可搶佔條件:進程已經獲得的資源在未使用完之前,不可以被搶佔,只能在使用完之後自己釋放
3、佔有申請條件:進程自己已經至少保持一個資源,又請求其他資源,但是這個資源被其他進程佔有,而且又不釋放自己已經佔有的資源
4、循環等待條件:發生死鎖時,必定會形成一個進程——資源的環路。進程集合{p1,p2,p3}中,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、查看數據庫的隔離級別(一般是RR:REPEATABLE-READ):
mysql> select @@tx_isolation;
mysql> select @@global.tx_isolation;
2、innodb引擎的狀態---會有死鎖信息(MyISAM存儲引擎沒有死鎖的說法)
mysql> SHOW ENGINE INNODB STATUS;
3、mysql都是autocommit,不會出現update卡住的情況,去查看下autocommit的值
mysql> select @@autocommit;
1表示自動提交。0表示不自動提交。
如果你發現自己的數據庫autocommit=0,將它改正。