前幾天我的mysql突然出現大量死鎖,全部需要一個個Kill id才能完成,下面我總結一下我最終解決死鎖方法吧.
myISAM和MEMORY存儲引擎采用的是表級鎖table-level locking
死鎖:所謂死鎖<DeadLock>:是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去.此時稱系統處于死鎖狀態或系統產生了死鎖,這些永遠在互相等竺的進程稱為死鎖進程.
表級鎖不會產生死鎖.所以解決死鎖主要還是真對于最常用的InnoDB.在遇到問題時,先執行show processlist找到死鎖線程號.然后Kil processNo.
當然主要解決還是需要去看一下具體的操作,可能產生死鎖.
Show innodb status檢查引擎狀態,可以看到哪些語句產生死鎖.
SHOW PROCESSLIST查看數據庫中表的狀態,是否被鎖.
kill id //殺掉被鎖的表,代碼如下:
- set autocommit=0;
- select * from t1 where uid='xxxx' for update //在有索引(例如uid)的情況下是行鎖,否則是表鎖
- insert into t1 values(1,'xxxxx');
- commit;
- =====================================================
- lock tables t1 write|read;
- insert into t1 values(2,'xxxxx'); //只有insert
- unlock tables; //Vevb.com
解決辦法:
1、全表掃描,沒有可用的索引.
2、解決把你程序中的SQL,把IN改成JOIN.
3、在mysql中的my.ini中把數據庫連接時間改小點.
新聞熱點
疑難解答