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中把數據庫連接時間改小點。