萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> mysql的死鎖問題分析與處理方法

mysql的死鎖問題分析與處理方法

前幾天我的mysql突然出現大量死鎖,全部需要一個個Kill id才能完成,下面我總結一下我最終解決死鎖方法吧。

myISAM和MEMORY存儲引擎采用的是表級鎖table-level locking

死鎖
所謂死鎖<DeadLock>: 是指兩個或兩個以上的進程在執行過程中,
因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去.
此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等竺的進程稱為死鎖進程.
 
表級鎖不會產生死鎖.所以解決死鎖主要還是真對於最常用的InnoDB.
 
在遇到問題時


先執行show processlist找到死鎖線程號.然後Kill 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;

解決辦法

1、全表掃描,沒有可用的索引。
2、解決把你程序中的SQL,把IN改成JOIN,
3、在mysql中的my.ini中把數據庫連接時間改小點。

copyright © 萬盛學電腦網 all rights reserved