mysql中MVVC機制下update之后select快照讀現象
在MySQL中,事務隔離級別為READ COMMITTED時,使用多版本并發控制(MVVC)機制來實現快照讀。
MVVC機制通過維護每個查詢的可見快照點(SCN),并利用系統版本表(redo log)來實現,保證每個事務都可以訪問查詢開始時數據庫的一致性視圖。
當事務A執行update語句修改一行數據后,該行數據的SCN值會增加。如果隨后另一個事務B執行select語句查詢該行數據,則會使用該行數據的SCN值與其可見快照點進行比較,以確定是否可見。
根據MVVC機制的匹配規則,當行數據的SCN值介于事務B的SCN值(m_low_limit_id)和上限SCN值(m_up_limit_id)之間的,則該行數據對于事務B是不可見的。
然而,在某些情況下,滿足第一條匹配規則時,update后select仍然能夠查詢到數據。該規則如下:
- 如果行數據的SCN值大于等于事務B的m_up_limit_id,并且行數據的update語句屬于事務B自身,則該行數據對于事務B是可見的。
因此,在問題中,事務A執行update語句后,id=5的數據的SCN值增加了。第二次 select 時,雖然該數據仍然介于事務A和B的SCN值之間,但由于該數據是由事務A自身更新的(屬于事務A),因此滿足了第一條匹配規則,所以事務B能夠查看到該數據。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END