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.什麼叫間隙鎖 當我們用範圍條件而不是相等條件檢索資料,...