next-key鎖(行鎖 + gap鎖) 行鎖
行鎖: 即record lock,指對單個行記錄上的鎖.
gap鎖
gap lock(間隙鎖): 表示鎖定乙個範圍,但不包括記錄本身.
其主要目的是為了防止同一事務的兩次當前讀出現幻讀的情況
.
它在rc及ru隔離級別中是沒有的,在rr以及序列化中預設支援,這就是為啥rc和ru無法避免幻讀的原因.
這裡主要討論rr隔離級別下gap鎖出現的場景
rr隔離級別下對主鍵索引或者唯一索引會用gap鎖嗎
視情況而定
如果where條件全部命中(理解為精確查詢的時候,所有記錄都有),則不會用gap鎖,只會加記錄鎖(行鎖)
.
例如: select * from user where id in (1,2,3),如果id為1,2,3的資料在資料庫中全部都有,那麼不會加gap鎖,如果只有一部分,那麼就會加.
此時不會出現幻讀現象,因為精確查詢的資料在資料庫中都有,事務b的新增操作一定在當前讀的範圍之外,所以事務b新增資料並提交之後,事務a再去做當前讀,還是獲取到原先的資料集.
如果where條件部分命中或者全不命中,則會加gap鎖.
gap鎖用在走非唯一索引或者不走索引的當前讀中
當前讀走非唯一索引的情況,如圖(圖中的gap表示所有可能的區間):
圖中id為非唯一鍵,如果沒有加gap鎖的話,會出現幻讀.
比如我們執行刪除id索引值為9的兩列,但是不提交
如果沒有gap鎖的話,我們此時在事務b中再插入id為9的資料,應該會成功
但是實際上是不成功的,它會等待事務a中刪除語句提交或者回滾再執行.
它此時會給id= 9的周邊都上gap鎖,本例中gap鎖的範圍是:(6, 11],對範圍外的資料進行更新是可以成功的.
當前讀不走索引的情況,如圖:
當前讀不走索引的時候,它會對所有的gap都上鎖,類似於表鎖的效果,不過比表鎖的開銷更大,因為他是一段一段鎖的.
innodb通過引入next-key鎖來避免幻讀問題
而next-key由record lock和gap lock組成.
資料庫考點 1
關係型資料庫和非關係型資料庫的區別 簡單來說 1.關係型資料庫通過外來鍵關聯來建立表與表之間的關係 2.非關係型資料庫通常指資料以物件的形式儲存在資料庫中,而物件之間的關係通過每個物件自身的屬性來決定 比如 有乙個學生的資料 姓名 張三,性別 男,學號 12345,班級 二年級一班 還有乙個班級的資...
資料庫考點 4
如何定位並優化慢查詢sql 慢查詢語句只會是dml,資料操作語言 這個問題屬於開放性的題目,具體場景需要具體分析,這裡給個大致思路 根據慢日誌定位慢查詢sql.使用explain等工具分析sql.修改sql或者盡量讓sql走索引.1.根據慢日誌定位慢查詢sql 慢日誌的作用就是用來記錄執行速度比較慢...
資料庫考點 6
myisam和innodb關於鎖方面的區別是什麼 myisam預設使用的是表級鎖,不支援行級鎖.innodb預設使用的是行級鎖,也支援表級鎖.下面的東西針對於myisam引擎 什麼是表級鎖 舉例 前提 我當前有一張表student,使用的是myisam引擎.我們在這裡模擬乙個併發操作哈 當我們對錶進...