mysql的鎖機制不同的儲存引擎支援不同的鎖機制,分為表級鎖、行級鎖、頁面鎖。myisam和memory儲存引擎採用的是表級鎖(table-level locking);bdb儲存引擎採用的是頁面鎖(page-level locking),但也支援表級鎖;innodb儲存引擎既支援行級鎖(row-level locking),也支援表級鎖,但預設情況下是採用行級鎖
表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖衝突的概率最高,併發度最低。
行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高。
頁面鎖:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,併發度一般
mysql的表級鎖有兩種模式:表共享讀鎖(table read lock)和表獨佔寫鎖(table write lock)。
對myisam表的讀操作,不會阻塞其他使用者對同一表的讀請求,但會阻塞對同一表的寫請求;對 myisam表的寫操作,則會阻塞其他使用者對同一表的讀和寫操作。
myisam在執行查詢語句(select)前,會自動給涉及的所有表加讀鎖,在執行更新操作 (update、delete、insert等)前,會自動給涉及的表加寫鎖,這個過程並不需要使用者干預,因此,使用者一般不需要直接用lock table命令給myisam表顯式加鎖。
innodb與myisam的最大不同有兩點:一是支援事務(transaction);二是採用了行級鎖。
行級鎖也支援讀鎖和寫鎖兩類。
mysql innodb引擎預設的修改資料語句:update,delete,insert都會自動給涉及到的資料加上排他鎖,select語句預設不會加任何鎖型別,如果加排他鎖可以使用select …for update語句,加共享鎖可以使用select … lock in share mode語句。所以加過排他鎖的資料行在其他事務種是不能修改資料的,也不能通過for update和lock in share mode鎖的方式查詢資料,但可以直接通過select …from…查詢資料,因為普通查詢沒有任何鎖機制。
innodb行鎖是通過給索引上的索引項加鎖來實現的,這一點mysql與oracle不同,後者是通過在資料塊中對相應資料行加鎖來實現的。innodb這種行鎖實現特點意味著:只有通過索引條件檢索資料,並請求共享或排他鎖時,innodb才使用行級鎖,否則,innodb將使用表鎖!
預設隔離級別(可重複讀)下,預設加的是next-key lock(為了解決幻讀問題),當索引中含有唯一屬性時(唯一索引,主鍵索引),會降級為record lock。
在讀已提交隔離級別下,加的是record lock
現在表z,有a,b兩列,a是主鍵,全表只有乙個主鍵索引。現在記錄如下:(1,1)(3,1)(5,3)(7,6)(10,8)
select * from z where b=3 for update
因為b沒有索引,所以走得是全表掃瞄。有因為加鎖是通過對索引加鎖實現,因為沒有走索引,所有會鎖整個表,也就是表鎖
現在表z,有a,b兩列,a是主鍵索引,b建立輔助索引。現在記錄如下:(1,1)(3,1)(5,3)(7,6)(10,8)
select * from z where a=3 for update
主鍵索引加的鎖是record lock,對記錄(3,1)加鎖
select * from z where b=3 for update
因為鎖是通過對索引加鎖實現的。所以這裡需要對主鍵索引和輔助索引加鎖,主鍵索引加的鎖會由next-key鎖退化成是record lock,輔助索引加的鎖是next-key lock,鎖定範圍是(1,3)、3、(3,6)
讀取的是快照版本,也就是歷史版本。普通的select就是快照讀
讀取的是最新版本。
update、delete、insert、select ... lock in share mode、select ... for update是當前讀。
預設的可重複讀隔離級別,使用的是快照讀
讀已提交使用的是當前讀
實現原理是通過mvcc機制實現,如果讀取的行正處於update或delete中,讀操作不會去等待行上x鎖的釋放,而是去讀取行的快照資料。
mvcc,多版本併發控制技術。在 innodb 中,在每一行記錄的後面增加兩個隱藏列,記錄建立版本號和刪除版本號。通過版本號和行鎖,從而提高資料庫系統併發效能。
一致性非鎖定讀可以極大的提高併發效能
不同的事務隔離級別,讀取的快照版本是有差別的
預設配置下,採用可重複讀的隔離級別,讀取資料採取的是一致性非鎖定讀。
但是某些場景下需要對讀取操作加鎖來保證嚴格的資料一致性,這時候可以顯式的對讀取的記錄進行加鎖:
出處:
如果你覺得文章不錯,文末的贊 ???? 又回來啦,記得給我「點讚」和「在看」哦~
MySQL MySQL鎖機制之行鎖理論
1.引入 2.行鎖的特點 行鎖偏向於innodb儲存引擎,開銷大,加鎖慢 會出現死鎖 鎖定的粒度最小,發生鎖衝突的概率最小,併發度也最高。3.行鎖的乙個基本案例 1 建立測試資料庫表boys drop table if exists boys create table boys id int 11 ...
MySQL MySQL鎖機制之讀鎖操作
1.引入 我們在之前的執行緒中,已經初步接觸到了鎖的一些相關的內容。那麼當時的我們使用售票為例子,列舉了在只剩一張票的時候電腦程式在實現購票中不加鎖出現的各種問題。當我們再執行緒中加了鎖以後,就可以保證計算機對這乙個資料的爭搶乙個有序的處理。那麼在mysql資料庫中。我們同樣需要學習資料庫的鎖機制來...
MySQL MySQL鎖機制之寫鎖操作
1.引入 2.寫鎖案例講解 1 資料庫表內容準備 drop table if exists admin create table admin id int 11 not null auto increment,username varchar 10 not null,password varchar...