一、為什麼需要鎖
鎖是計算機協調多個程序或執行緒併發訪問某一資源的機制。
為了保證資料庫中資料併發訪問的一致性、有效性,故引入鎖機制。其中鎖衝突也是影響資料庫併發訪問效能的乙個重要因素。
二、鎖的分類
分類一:行鎖,頁鎖,表鎖;
分類二:共享鎖、排他鎖、意向鎖(is、ix);
分類三:樂觀鎖、悲觀鎖;
innodb的行級別鎖分為:記錄鎖、間隔鎖、next-key鎖。
mysql中,每種儲存引擎支援不同的鎖機制。
myisam、memory:支援表級鎖(table-level locking);
bdb:支援頁面鎖(table-level locking),也支援表級鎖;
innodb:支援行級鎖(row-level locking),也支援表級鎖。
三、鎖的優缺點
表級鎖:開銷小,加鎖快;不會出現死鎖;
鎖定粒度大,發生鎖衝突的概率最高,併發度最低。
行級鎖:開銷大,加鎖慢;會出現死鎖;
鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高。
頁面鎖:開銷和加鎖時間界於表鎖和行鎖之間;
會出現死鎖;鎖定粒度界於表鎖和行鎖之間,併發度一般。
四、鎖的使用
1、查詢myisam的鎖的相關情況
可以通過檢查table_locks_waited和table_locks_immediate狀態變數來分析系統上的表鎖定爭奪。
show status like 『table%』;
如果table_locks_waited的值比較高,則說明存在著較嚴重的表級鎖爭用情況。
2、查詢innodb的鎖的相關資訊
可以通過檢查innodb_row_lock狀態變數來分析系統上的行鎖的爭奪情況:
mysql> show status like 『innodb_row_lock%』;
3、檢視資料庫中的所有會話資訊
show processlist;
4、檢視正在鎖的事務
select * from information_schema.innodb_locks;
5、檢視等待鎖的事務
select * from information_schema.innodb_lock_waits;
6、手動鎖表與釋放
表級別鎖:
共享鎖(s鎖/讀鎖)
lock table table_name [ as alias_name ] read
排他鎖(x鎖/寫鎖 )
lock table table_name [as alias_name][ low_priority ] write
釋放鎖:
unlock tables;
7、行級別鎖表與釋放(innodb引擎)
共享鎖(s鎖/讀鎖)
select … lock in share mode;
排他鎖(x鎖/寫鎖)
select … for update;
釋放鎖:
unlock tables;
注意事項:
1、myisam在執行查詢語句(select)前,會自動給涉及的所有表加讀鎖,在執行更新操作 (update、delete、insert等)前,會自動給涉及的表加寫鎖,這個過程並不需要使用者干預,因此,使用者一般不需要直接用lock table命令給myisam表顯式加鎖。
2、innodb行鎖是通過給索引上的索引項加鎖來實現的,這一點mysql與oracle不同,後者是通過在資料塊中對相應資料行加鎖來實現的。innodb這種行鎖實現特點意味著:只有通過索引條件檢索資料,innodb才使用行級鎖,否則,innodb將使用表鎖!
MySQL 鎖機制簡述
1 只有通過索引條件檢索資料,innodb才使用行級鎖,否則,innodb 將使用表鎖。2 由於mysql的行鎖是針對索引加的鎖,不是針對記錄加的鎖,所以雖然是訪問不同行的記錄,但是如果是使用相同的索引鍵,是會出現鎖衝突的。3 當表有多個索引的時候,不同的事務可以使用不同的索引鎖定不同的行,另外,不...
mysql鎖機制 mysql 鎖機制
一 概述 mysql有三種鎖的級別 頁級 表級 行級。myisam和memory儲存引擎採用的是表級鎖 table level locking bdb儲存引擎採用的是頁面鎖 page level locking 但也支援表級鎖 innodb儲存引擎既支援行級鎖 row level locking 也...
mysql鎖機制總結 mysql鎖機制總結
1.隔離級別 1 讀不提交 read uncommited,ru 這種隔離級別下,事務間完全不隔離,會產生髒讀,可以讀取未提交的記錄,實際情況下不會使用。2 讀提交 read commited,rc 僅能讀取到已提交的記錄,這種隔離級別下,會存在幻讀現象,所謂幻讀是指在同乙個事務中,多次執行同乙個查...