你在項目中用到事務了嗎,如果你對表中的數據進行了兩次操作,
1 更新表中的數據 成功
2 刪除表中的數據 失敗
那么請問 你更新能成功嗎。
菜雞本菜的回答:事務的原子性 導致不會成功。
大佬說(非面試官):這個應該是面試官要問你間隙鎖。 通過版本號來標記,不存在刪除數據的操作,只是版本號無效。
理論:
MVCC和間隙鎖
多版本並發控制(Multi-VersionConcurrency Control,Mvcc)是mysql的InnoDb存儲引擎實現隔離級別的一種具體的方式,
用於實現讀已提交和可重復讀這兩種隔離級別。讀未提交總是讀取最新的數據行,無需使用MVCC。可串行化隔離級別需要
對所有的行都加鎖,僅僅依賴MVCC是無法實現的。
MVCC可以認為是行級鎖的一個變種,但是他在很多情況下都避免了加鎖操作,因此開銷更低。
InnoDb的版本號是樂觀並發控制,每行數據存在一個版本號,每次更新數據都更新該版本號,修改時copy出當前版本。隨意修改,各個
事務之間互不干擾,保存時比較版本號,如果版本號一致則commit,不一致就rollback。MVCC在每行記錄后面都隱藏着兩個列,用來存儲
兩個版本號,創建版本號和刪除版本號。
查詢(select):InnoDb只會查找系統版本號小於或者等於當前事務的版本號並且刪除版本號未定義或者大於當前事務的版本號的行,這樣可以確保讀取的
行要么是在事物開始前就已經存在的,要么是事務本身插入修改的,且在事務開始前未被刪除。
更新(update):將當前系統的版本號當做數據行的刪除版本還,並且將當前系統版本號作為修改后數據行的創建版本號(拗口)
MVCC不能解決幻讀問題,在可重復讀的隔離級別下,使用MVCC+Next-Key Locks可以解決幻讀的問題。
Next-KeyLocks是InnoDB行鎖和間隙鎖的默認組合。間隙鎖是在鎖定索引記錄間隙,確保索引記錄的間隙不變。
Next-KeyLocks當對數據進行條件范圍檢索的時候,對其范圍內存在的值進行加鎖,防止其他事務的插入操作來達到防止幻影讀的目的。