mysql鎖表原因及解決方案

一、導致鎖表的原因

1、鎖表發生在insert  update 、delete 中;  
2、鎖表的原理是 數據庫使用獨佔式封鎖機制,當執行上面的語句時,對錶進行鎖住,直到發生commite 或者 回滾 或者退出數據庫用戶; 
3、鎖表的原因 :
  第一、 A程序執行了對 tableA 的 insert ,並還未 commite時,B程序也對tableA 進行insert 則此時會發生資源正忙的異常 就是鎖表;
  第二、鎖表常發生於併發而不是並行(並行時,一個線程操作數據庫時,另一個線程是不能操作數據庫的,cpu 和i/o 分配原則)
4、減少鎖表的概率:
   減少insert 、update 、delete 語句執行 到 commite 之間的時間。具體點批量執行改爲單個執行、優化sql自身的非執行速度
   如果異常對事物進行回滾。

二、mysql鎖表的解決

#查看進程id,然後用kill id殺掉進程
show processlist;
SELECT * FROM information_schema.PROCESSLIST;
#查詢正在執行的進程
SELECT * FROM information_schema.PROCESSLIST where length(info) >0 ;

#查詢是否鎖表
show OPEN TABLES where In_use > 0;

#查看被鎖住的
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
#等待鎖定
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
#殺掉鎖表進程
kill 5601
 

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