主要通過以下兩種情況避免幻讀
內在: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 表名...