mysql的快照讀行為
在MySQL中,事務隔離的行為通過MVCC(多版本并發控制)機制實現,該機制確保同一數據不會被多個事務同時修改,從而導致數據不一致。在事務隔離級別為REPEATABLE READ的情況下,讀取操作會返回開始事務時的數據快照,即其他事務的修改不會立即被讀取到。
快照讀與UPDATE的影響
但有例外情況,當一個事務執行了UPDATE操作后,后續的select操作可能不會再返回快照數據。在這種情況下,MySQL會根據以下規則決定是否返回最新數據:
- 被修改的行ID必須大于事務的m_up_limit_id。
- 被修改的行ID必須小于或等于事務的m_low_limit_id。
案例分析
在給定的案例中,事務A執行了SELECT操作,沒有查到ID為5的數據,因為該數據被事務B的UPDATE操作修改了。按照MVCC機制,事務A的后續SELECT操作應該仍然無法查到該數據,因為它介于m_up_limit_id(事務A的ID)和m_low_limit_id(事務B的ID加1)之間。
異常行為的原因
但實際上,事務A的第二次SELECT操作卻查到了ID為5的數據,原因是滿足了上述規則的第一條:被修改行的ID(5)大于事務A的m_up_limit_id(事務A的ID),因此MySQL返回了最新數據。
這表明在REPEATABLE READ隔離級別下,快照讀并非在任何情況下都是完全一致的,當滿足特定規則時,MySQL可能會返回最新數據,以保證數據更及時地可見。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END