InnoDB可重複讀隔離級別下如何避免幻讀

2021-10-06 09:52:51 字數 762 閱讀 9834

主要通過以下兩種情況避免幻讀

內在:next-key鎖(行鎖+gap鎖)

上了鎖,你別的操作不會修改我鎖定的區間了,我就不會幻讀

首先我們理解下面兩個概念,當前讀和快照讀

對主鍵索引或者唯一索引會用gap鎖麼?

gap區間

開啟mysql官網,我們看看它對gap區間的描述,分段進行區間劃分

實戰驗證

建立乙個表,id(唯一鍵unique_id)、name(主鍵),插入資料id為1、2、3、5、6、9,name欄位隨意

我手動劃分一下gap區間【1,2】【2,3】【3,5】【5,6】【6,9】【9,+∞】

如果where條件全部命中,不會使用gap鎖,只會加記錄鎖(行鎖)

rr模式下,s1、s2開啟事務,s1查詢id為9,s2插入id為9,會被blocking,插入id為7則不會鎖,說明他開的是行鎖,因為鎖9,gap鎖會鎖住【6,9】區間

where條件未全部命中、全不命中會開gap鎖

rr模式下,s1、s2開啟事務,s1查詢id為5、7、9(其中沒有id為7的資料,部分命中),s2插入id為8,會被blocking,因為此時使用gap鎖,鎖住區間【5,6】【6,9】

gap鎖會用在非唯一索引或者不走索引的當前讀

事務隔離級別 可重複讀

mysql pom 5 select global.tx isolation global.tx isolation repeatable read 如果事務隔離級別顯示repeatable read,即是可重複讀。在資料庫操作中,為了有效保證併發讀取資料的正確性,提出的事務隔離級別。我們的資料庫鎖...

MySQL事務隔離級別可重複讀測試

開啟rds,查詢當前的事務隔離級別select tx isolation查詢得到時候可重複讀,於是做了如下測試。可重複隔離級別的特點是,每個事務可以在乙個事務中可以反覆讀取資料,每次讀取到的資料都是相同的。在 高效能mysql 一書中,講到這種隔離級別很好的解決了髒讀問題,也就是讀取的資料都是事務開...

InnoDB在MySQL預設隔離級別下解決幻讀

在rr的隔離級別下,innodb使用mvvc和next key locks解決幻讀,mvvc解決的是普通讀 快照讀 的幻讀,next key locks解決的是當前讀情況下的幻讀。事務a,先執行 update table set name hh where id 3 結果為 ok row xx 表名...