mysql Innodb 三種行鎖(記錄鎖、間隙鎖與臨鍵鎖)


Record Lock:記錄鎖,單個行記錄上的鎖。
Gap Lock:間隙鎖,鎖定一個范圍,但不包括記錄本身。
Next-Key Lock:臨鍵鎖,鎖定一個范圍,並且鎖定記錄本身。對於行的查詢,都是采用該方法,可以解決幻讀的問題。


什么是幻讀?


事務A讀取與搜索條件相匹配的若干行。事務B以插入或刪除行等方式來修改事務A的結果集,然后再提交,然后待事務A再次進行查詢時發現數據與第一次不匹配。Serializable隔離級別也可以解決幻讀問題,雖然實現簡單,數據更加安全,但是並發能力非常差,不推薦。突然又想到事務隔離級別,下次再說。

記錄鎖:
記錄鎖就是為某行記錄加鎖,列必須為唯一索引列或主鍵列,否則加的鎖就會變成臨鍵鎖,
查詢語句必須為精准匹配 = ,不能為 >、<、like等,否則也會退化成臨鍵鎖。

間隙鎖:
間隙鎖基於非唯一索引,它鎖定一段范圍內的索引記錄。比如查詢字段區間為1-5,即1-5內的記錄行都會被鎖住,2、3、4 的數據行的會被阻塞,但是 1 和 5 兩條記錄行並不會被鎖住。

臨鍵鎖:
臨鍵鎖可以理解為一種特殊的間隙鎖,上面說過了通過臨建鎖可以解決幻讀的問題。 每個數據行上的非唯一索引列上都會存在一把臨鍵鎖,當某個事務持有該數據行的臨鍵鎖時,會鎖住一段左開右閉區間的數據。

假設某表age字段下有:5,10,15,20

該表中 age列潛在的臨鍵鎖有:
(-∞, 5],
(5, 10],
(10, 15],
(15, 20],
(20, +∞],

在事務 A 中修改年齡為5的記錄。之后如果在事務 B 中執行插入年齡為8的數據,便會被阻塞。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM