MySQL高級九-MyISAM表鎖(共享讀鎖)

黄舟
發布: 2016-12-29 16:44:08
原創
1282 人瀏覽過

鎖是電腦協調多個行程或執行緒並發存取某一資源的機制。在資料庫中,資料也是一種供許多使用者共享的資源。如何確保資料存取的一致性、有效性是所有資料庫的問題,鎖定衝突也是影響資料庫並發存取效能的重要的因素,從這個角度來說,鎖對資料庫而言顯得尤其重要,也更加複雜。

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;


對MyISAM表的讀取操作,不會阻塞其他使用者對同一張表的讀取請求,但會阻塞對同一表的請求;對MyISAM表的寫入操作,則會阻塞其他使用者對同一張表的讀和寫入操作;MyISAM表的讀取操作與寫入的操作之間,以及寫入操作之間是串行的!當一個執行緒獲得對一個表的寫鎖後,只有持有鎖的執行緒可以對表進行更新操作。其他執行緒的讀取、寫入操作都會等待,直到鎖被釋放為止。

一個SESSION使用Lock table 指令為表格加鎖,這個SESSION可以查詢鎖定表中的記錄,但更新或存取其他表都會提示錯誤;同時,另一個SESSION可以查詢表中的記錄,但更新就會出現鎖等待。

 以上就是MySQL高級九-MyISAM表鎖(共享讀鎖)的內容,更多相關內容請關注PHP中文網(www.php.cn)!


相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板