Mysql知識梳理 解決幻讀

2021-10-05 13:59:40 字數 869 閱讀 8106

解決幻讀

透徹解讀mysql的可重複讀、幻讀及實現原理

我總結的加鎖規則裡面,包含了兩個「原則」、兩個「優化」和乙個「bug」。

原則 1:加鎖的基本單位是 next-key lock。希望你還記得,next-key lock 是前開後閉區間。

原則 2:查詢過程中訪問到的物件才會加鎖。

優化 1:索引上的等值查詢,給唯一索引加鎖的時候,next-key lock 退化為行鎖。

優化 2:索引上的等值查詢,向右遍歷時且最後乙個值不滿足等值條件的時候,next-key lock 退化為間隙鎖。

乙個 bug:唯一索引上的範圍查詢會訪問到不滿足條件的第乙個值為止。我還是以上篇文章的表 t 為例,和你解釋一下這些規則。表 t 的建表語句和初始化

兩階段鎖:

鎖是用的時候才加上的,但不是不用的時候就能立刻釋放的。

可重複讀隔離級別遵守兩階段鎖協議,所有加鎖的資源,都是在事務提交或者回滾的時候才釋放的。

所有的事務必須分兩個階段對資料項加鎖和解鎖。即事務分兩個階段,第乙個階段是獲得封鎖。事務可以獲得任何資料項上的任何型別的鎖,但是不能釋放;第二階段是釋放封鎖,事務可以釋放任何資料項上的任何型別的鎖,但不能申請。

第一階段是獲得封鎖的階段,稱為擴充套件階段:其實也就是該階段可以進入加鎖操作,在對任何資料進行讀操作之前要申請獲得s鎖,在進行寫操作之前要申請並獲得x鎖,加鎖不成功,則事務進入等待狀態,直到加鎖成功才繼續執行。就是加鎖後就不能解鎖了。

第二階段是釋放封鎖的階段,稱為收縮階段:當事務釋放乙個封鎖後,事務進入封鎖階段,在該階段只能進行解鎖而不能再進行加鎖操作。

mysql幻讀 mysql 幻讀

幻讀 phantom read 是指當使用者讀取某一範圍的資料行時,b事務在該範圍內插入了新行,當使用者再讀取該範圍的資料行時,會發現有新的 幻影 行。innodb和falcon儲存引擎通 過多版本併發控制機制解決了幻讀問題。a事務讀取了b事務已經提交的新增資料,此時 a 還沒有提交,當前提交後,也...

Mysql如何解決幻讀

日常開發中接觸到最多的事務隔離級別分別是read committed和repeatable read也就是我們常說的提交讀和可重複讀。innodb的rr級別和rc級別最大的區別就是增加了gap鎖也就是間隙鎖,那麼間隙鎖是如何解決幻讀的呢?回憶一下幻讀和髒讀的概念,髒讀就是,乙個事物讀到了另乙個事務未...

mysql MVCC 間隙鎖解決幻讀理解

mysql的隔離級別?讀未提交 讀提交 可重複讀 序列化 innodb預設級別為可重複讀,可重複讀會產生問題 就是幻讀。什麼是幻讀?不可重複讀側重於update這種操作,同一條資料前後讀起來不一樣的情況,幻讀側重於insert delete這種操作,前後兩次select 資料的數量會發生變化 舉個例...