字體:  

什麼是 table_locks_waited 和 table_locks_immediate?

ppstream 發表於: 2012-1-27 10:46 來源: ADJ網路控股集團


一般情況下,MYSQL在更新操作(INSERT、DELETE、UPDATE)會自動加表鎖(table lock)。 不需要顯式加鎖。 除非是數據要求嚴格的邏輯寫順序。

執行查詢語句(SELECT)前,會自動給涉及的所有表加讀鎖,在執行更新操作前,會自動給相關的表加寫鎖,這個過程並不需要用戶干預,因此,用戶一般不需要直接用LOCK TABLE命令給MyISAM表顯式加鎖。

MyISAM存儲引擎只支持表鎖,這也是MySQL開始幾個版本中唯一支持的鎖類型。 隨著應用對事務完整性和並發性要求的不斷提高,MySQL才開始開發基於事務的存儲引擎,後來慢慢出現了支持 頁鎖 的BDB存儲引擎和支持 行鎖 的InnoDB存儲引擎(實際InnoDB是單獨的一個公司,現在已經被Oracle公司收購)。 但是MyISAM的表鎖依然是使用最為廣泛的鎖類型。 本節將詳細介紹MyISAM表鎖的使用。

如果要檢查  table_locks_waited 和 table_locks_immediate 的狀態,可以使用底下指令查看:
mysql>show status like ‘table%’;
如果 table_locks_waited 的值比較高,表示有嚴重的爭鎖情況。

MySQL 表鎖模式MySQL的表鎖有兩種模式:讀鎖(Table Read Lock)和寫鎖(Table Write Lock)。

對MyISAM表的讀取操作(READ),不會阻塞其他用戶對同一個表的讀取請求,但是會阻塞對同一個表的寫入請求;對MyISAM表的寫入操作(WRITE),則會阻塞其他用戶對同一個表的讀取和寫入操作。

更詳細的 MySQL表鎖可以參考:http://xgbjmxn.iteye.com/blog/976124