1 鎖機制
當前MySQL已經支持 ISAM, MyISAM, MEMORY (HEAP) 類型表的表級鎖了,BDB 表支持頁級鎖,InnoDB 表支持行級鎖。很多時候,可以通過經驗來猜測什麼樣的鎖對應用程序更合適,不過通常很難說一個鎖比別的更好,這全都要依據應用程序來決定,不同的地方可能需要不同的鎖。
想要決定是否需要采用一個支持行級鎖的存儲引擎,就要看看應用程序都要做什麼,其中的查詢、更新語句是怎麼用的。例如,很多的web應用程序大量的做查詢,很少刪除,主要是基於索引的更新,只往特定的表中插入記錄。采用基本的MySQL MyISAM 表就很合適了。
MySQL中對表級鎖的存儲引擎來說是釋放死鎖的。避免死鎖可以這樣做到:在任何查詢之前先請求鎖,並且按照請求的順序鎖表。
MySQL中用於 WRITE(寫) 的表鎖的實現機制如下:
如果表沒有加鎖,那麼就加一個寫鎖。
否則的話,將請求放到寫鎖隊列中。
MySQL中用於 READ(讀) 的表鎖的實現機制如下:
如果表沒有加寫鎖,那麼就加一個讀鎖。
否則的話,將請求放到讀鎖隊列中。
當鎖釋放後,寫鎖隊列中的線程可以用這個鎖資源,然後才輪到讀鎖隊列中的線程。
這就是說,如果表裡有很多更新操作的話,那麼 SELECT 必須等到所有的更新都完成了之後才能開始。
從 MySQL 3.23.33 開始,可以通過狀態變量 Table_locks_waited 和 Table_locks_immediate 來分析系統中的鎖表爭奪情況:
mysql>SHOWSTATUSLIKE'Table%';
+-----------------------+---------+
|Variable_name|Value|
+-----------------------+---------+
|Table_locks_immediate|1151552|
|Table_locks_waited|15324|
+-----------------------+---------+