MyISAM存儲引擎只支持表鎖,mysql的表鎖有兩種模式:讀鎖和寫鎖。他們的兼容關系是(對myisam的讀操作,不會阻塞其他用戶對同一表的讀請求,但會阻塞對同一表的寫操作*)和(對myisam的寫操作,則會阻塞其他用戶對同一表的讀和寫操作),讀寫操作是串行的。
MyISAM在執行查詢語句(select)前,會自動給涉及的所有表加上讀鎖。在執行更新操作(update,delete,insert等)前,會自動給涉及的表加上寫鎖,這個過程不需要用戶干預。
說明:
在一定的條件下,MyISAM表支持查詢和插入並發執行。MyISAm有一個系統變量concurrent_insert,用來專門控制其並發行為的。0-不允許插入;1-如果表沒有空洞,允許在表尾插入記錄,這是mysql默認設置;2-無論是否有空洞,都允許在表尾插入記錄。
myISAM的讀鎖和寫鎖是互斥的,讀寫串行的。那麼,在一個進程請求某個MyISAM表的鎖的時候,同時另一個進程也請求同一表的寫鎖。MySQL如何處理?結果是先寫進程後讀進程。這是應為mysql認為寫請求一般比讀請求重要。我們可以通過一些設置來改變鎖處理先後順序:
通過啟動參數low-priority-updates,使MyISAM引擎默認給予讀侵權以優先權利。 通過set low_priority_updates=1,使該連接發出的更新請求優先級降低。 通過指定insert,update,delete語句的low_priority屬性,降低該語句的優先級。 還可以設置max_write_lock_count。當表的讀鎖到這個值的時候,mysql就暫時將寫請求的優先級降低,給讀進程一個獲得鎖的機會。