mysql MVCC 間隙鎖解決幻讀理解

2022-06-24 16:45:11 字數 2170 閱讀 6555

mysql的隔離級別?

讀未提交  -》 讀提交 -》 可重複讀 -》 序列化

innodb預設級別為可重複讀,可重複讀會產生問題 就是幻讀。

什麼是幻讀?

不可重複讀側重於update這種操作,同一條資料前後讀起來不一樣的情況,

幻讀側重於insert delete這種操作,前後兩次select 資料的數量會發生變化

舉個例子:

事務a  第一步  select *       第二步  update 所有字段        第三步  再次select *      

事務b  執行了insert 一條語句

幻讀第一種情況: 當事務a 剛執行完第一步,事務b insert一條,導致事務a update執行完,再次select發現多了一條資料

幻讀第二種情況: 當事務a 剛執行完第二步,事務b insert一條,導致事務a 再次select 發現有一條資料沒有update欄位

innodb如何解決幻讀的?

mvcc+行鎖+間隙鎖

什麼是間隙鎖?

正常等值條件 並且值存在的情況下加的是行鎖

如果等值條件 值不存在的情況下加的是間隙鎖,或者範圍查詢,加的也是間隙鎖

舉個例子:

根據主鍵id,不只是有五個行鎖,還會有六個間隙鎖,左開右閉原則,(-∞,5](5,10](10,15](15,20](20,25](25,+supernum]

例如 select * from table where id = 10 for update;   等值條件,id是存在的,加行鎖就可以了

select * from table where id = 7 for update;  等值條件,id不存在,加(5,10] 間隙鎖,這範圍間不允許插入資料,直到這個事務提交完成釋放鎖

select * from table where id > 24;  範圍條件,加間隙鎖

通過行鎖+間隙鎖的機制保證了事務a select之後,其他事務相應的insert操作會阻塞

什麼是undolog?

undolog存放不同事務版本下的不同資料,

用於 1.歷史恢復 通過undolog恢復之前版本的資料   2. 讀老版本  根據條件讀舊版本的資料

每次資料變更都會產生undolog記錄,undolog記錄分為 insert undo_log 和 update undo_log

insert操作屬於insert undo_log,只針對當前事務,在insert操作後產生undo_log記錄,在事務提交後刪除undo_log記錄,說白了就是給當前事務自己看的.

update 和 delete操作屬於update undo_log,會根據隔離級別不同事務版本的資料可見性不同

什麼是readview?

readview根據生成時間不同,產生了rc,rr兩種可見性

rc:每條select建立乙個新的readview  ,所以導致讀提交  讀到的都是最新提交的!

rr:事務開始的時候建立乙個readview, 一直到事務結束都用的這個readview,也就避免了不可重複讀

當前讀與快照讀

單條普通的select語句屬於快照讀

select for update  , insert, update, delete 屬於當前讀

快照讀由mvcc+undolog實現

當前讀由行鎖+間隙鎖實現

什麼是mvcc?

多版本併發控制(multi-version concurrency control, mvcc)

僅在讀提交和可重複讀兩種隔離級別下生效

每行記錄欄位都儲存有  乙個最近變更事務id  乙個最新刪除的事務id

事務讀資料的原則就是: 讀版本號小於等於當前版本的資料(意思就是讀不到在當前事務之後修改的資料 避免了不可重複讀)

讀刪除事務版本號大於等於當前版本的資料(意思就是如果這條資料在之後的事務裡刪了,當前事務也不能再讀了) 

innodb實現mvcc 是通過 readview+undolog 來實現

Mysql鎖 幻讀解決方案 間隙鎖

1.在可重複讀隔離級別下,普通的查詢是快照讀,是不會看到別的事務插入的資料的。因此,幻讀在 當前讀 下才會出現。2.幻讀指新插入的行,讀到原本存在行的更新結果不算。因為當前讀的作用就是能讀到所有已經提交記錄的最新值。產生幻讀的原因是,行鎖只能鎖住行,但是新插入記錄這個動作,要更新的是記錄之間的 間隙...

Mysql MVCC原理和幻讀解決

reference reference 快照讀 顧名思義,就是讀取的是快照資料,不加鎖的普通select都是快照讀 當前讀 就是讀取最新資料,而不是歷史資料,或者說不是快照資料,是加鎖的select,或者對資料進行正刪改都會進行當前讀。實現原理主要是版本鏈。undo日誌 readview來實現的。i...

mysql間隙鎖 mysql間隙鎖

前面一文 mysql鎖 介紹了mysql innodb儲存引擎的各種鎖,本文介紹一下innodb儲存引擎的間隙鎖,就以下問題展開討論 1.什麼是間隙鎖?間隙鎖是怎樣產生的?2.間隙鎖有什麼作用?3.使用間隙鎖有什麼隱患?一 間隙鎖的基本概念 1.什麼叫間隙鎖 當我們用範圍條件而不是相等條件檢索資料,...