鎖是計算機協調多個進程或線程并發訪問某一資源的機制。在數據庫中,數據也是一種供許多用戶共享的資源。如何保證數據訪問的一致性、有效性是所有數據庫的一個問題,鎖沖突也是影響數據庫并發訪問性能的一個重要的因素,從這個角度來說,鎖對數據庫而言顯得尤其重要,也更加復雜。
mysql鎖概述
相對其他數據庫而言,mysql的鎖機制比較簡單,其最顯著的特點是不同的存儲引擎支持不同的鎖機制。比如,myisam和memory存儲引擎采用的是表級鎖(table-level locking);bdb存儲引擎采用的是頁面鎖(page-level locking),但也支持表級鎖,但在默認情況下是采用行級鎖。
可以通過檢查table_locks_waited和table_locks_immediate狀態變量來分析系統上的表鎖定爭奪:
show status like ‘table%’;
得出的結果如果table_locks_waited的值比較高,則說明存在著較嚴重的表級鎖爭用情況。
mysql這三種鎖的特征:
開銷、加鎖速度、死鎖、粒度、并發性能
表級鎖:開銷小,加鎖快,不會出現死鎖,鎖定粒度大,發生沖突的概率最高,并發度最低;
行級鎖:開銷大,加鎖慢,會出現死鎖,鎖定粒度小,發生鎖沖突的概率最低,并發度最高;
頁面鎖:開銷介于前兩者之間,會出現死鎖,鎖定粒度介于前兩者之間,并發度一般;
僅從鎖的角度來說:表級鎖更適合于以查詢為主,只有少量按索引條件更新數據的應用,如web應用;而行級鎖則更適合于有大量按索引條件并發更新少量不同數據,同時僅有并發查詢的應用,如一些在線事務處理(oltp)系統。
mysql的表級鎖有兩種模式:表共享讀鎖(table read lock)和表獨占寫鎖(table write lock)。
給表加鎖
1、加共享讀鎖
lock table 表名 read
2、解鎖
unlock tables;
3、表獨占寫鎖
lock table 表名 write;
說明:
對myisam表的讀操作,不會阻塞其他用戶對同一張表的讀請求,但會阻塞對同一表的請求;對myisam表的寫操作,則會阻塞其他用戶對同一張表的讀和寫操作;myisam表的讀操作與寫的操作之間,以及寫操作之間是串行的!當一個線程獲得對一個表的寫鎖后,只有持有鎖的線程可以對表進行更新操作。其他線程的讀、寫操作都會等待,直到鎖被釋放為止。
一個session使用lock table 命令給表加鎖,這個session可以查詢鎖定表中的記錄,但更新或訪問其他表都會提示錯誤;同時,另一個session可以查詢表中的記錄,但更新就會出現鎖等待。
?以上就是MySQL高級九——MyISAM表鎖(共享讀鎖)的內容,更多相關內容請關注PHP中文網(www.php.cn)!