Mysql innodb引擎(二)鎖

2021-09-24 07:49:49 字數 1315 閱讀 1984

專案

isixsx

is相容

相容相容

不相容ix

相容相容

不相容不相容s相容

不相容相容

不相容x

不相容不相容

不相容不相容

是指 innodb 通過多版本控制的方式來讀取當前執行時間資料庫中的資料。如果,讀取的時候行正好在執行 delete 或 update 的排他操作,那讀取操作不會等待,會直接去讀取乙個快照版本的行資料。

一行資料可能不止乙個快照,實際上是通過 undo 段來完成的

則是通過在事務中顯式的用 for update 和 lock in share mode 加鎖。當事務提交後鎖才會釋放。

當索引含有唯一屬性時,next-key lock會自動降級為record lock 用來減少鎖定的範圍,加大併發的處理速度。但是此種情況只存在於查詢【所有的唯一索引列】。如果,唯一索引由多個列組成,而查詢是查詢多個唯一索引列中的其中乙個,那麼這種查詢由於聯合索引的特性,查詢是乙個範圍查詢,而不是點查詢,所以不會降級處理。

當某個表有2個索引,乙個聚集唯一索引,乙個輔助索引。有(1,1)(2,3),(3,5),(4,7)這4個資料行。執行select * from t where b=5 for update。此時聚集唯一索引因為鎖降級的優化,會對a=3加上record lock,但是為了避免幻讀,輔助索引會有2種鎖,第一種是b=5的record lock,還有(3,5)(5,7) 2個範圍的grap lock。由於索引 b+tree 的屬性,聯合索引 a列又在b列之前,所以索引的節點值是

[舉例,索引不一定真的是這種結構]    

(3,5)

/ \

[(1,1)(2,3)] [(3,5)(4,7)]

複製**

如果沒有鎖定b 列的(5,7)範圍我再insert (4,5) 是可以插入進去的,因為a=3和 b=5都被 record lock 鎖定了,但是按聯合索引的特性是按前序列進行排序插入的,此時並不會觸發到b=5的 record lock。這樣就會導致幻讀,連續執行select * from t where b=5 for update這個語句上乙個事務的結果與下一次執行的這個語句得到的結果不會一樣。

mysql innodb 的預設事務級別是 repeatable read

略過,可以在其他層面理解。目前還沒有深入了解的打算

由於 innodb 的鎖根據頁粒度進行加鎖,並採取點陣圖的方式,鎖資源開銷較小,不存在鎖公升級的操作。

mysql innodb引擎(一)緩衝和索引

mysql innodb引擎(三) 事務

MYSQL InnoDB儲存引擎 鎖

目錄 鎖的型別 行級鎖 意向鎖 一種表級鎖 一致性非鎖定讀 innodb儲存引擎的預設設定 行鎖的3種演算法 死鎖 innodb儲存引擎實現了如下兩種標準的行級鎖 1 共享鎖 s lock 允許事務讀一行資料。select column from table lock in share mode 2...

MySQL Innodb引擎鎖總結

1.鎖的目的是什麼?innodb中利用mvcc 多版本併發控制 可以在不加鎖的情況下提高併發訪問下系統的吞吐量。但有些場景下併發訪問必須要在鎖的保護下進行,比如併發的更新。2.鎖的分類 一般鎖是指lock。innodb中還有不常用的一種輕量級鎖latch,latch中不存在死鎖檢測機制,適合加鎖時間...

MySQL InnoDB儲存引擎中的鎖(二)

innodb儲存引擎中有三種行鎖演算法 1.1 next key lock next key lock 是結合了gap lock 和 record lock的一種鎖定演算法,例如有乙個索引有10,11,13,20 四個值,則next key lock的鎖定區間為 10 10,11 11,13 13,...