簡要回答:
MVCC(multi version concurrency control)即多版本并發控制,為了確保多線程下數據的安全,可以通過undo log和ReadView來實現不同的事務隔離級別。
對于已提交讀和可重復讀隔離級別的事務來說,MVCC是通過undo log和ReadView來實現的,區別在于創建Read View的時機不同。
已提交讀:在每個select語句執行前生成Read View
可重復讀:在第一個select語句執行前生成Read View
詳細解釋:
MVCC(multi version concurrency control)即多版本并發控制,為了確保多線程下數據的安全。
多線程下數據存在安全問題,如:臟讀,不可重復讀,幻讀
臟讀:有AB兩個事務,B事務對一條數據進行修改,但未提交;而A事務在這之后對同一條數據進行讀操作,讀到的若是未提交的修改后的數據,就產生了臟讀問題。
不可重復讀:有AB兩個事務,A在多次執行一條查詢的SQL語句,在A執行的過程中B修改了某條數據,導致A多次讀出來的結果不一樣
幻讀:有AB兩個事務,A在多次執行一條查詢的SQL語句,在A執行的過程中B插入了了某條數據,導致A多次讀出來的結果不一樣
為了避免上述問題,就有了MVCC,用MVCC可以使用undo log和ReadView來實現不同的事務隔離級別
undo log:回滾日志,存儲了每行數據的多個版本
ReadView:判斷當前事務可以讀取哪個版本的依據
事務的隔離級別:
未提交讀(RU)
已提交讀(RC)
可重復讀(RR)
序列化/串行化(Serializable)
隔離級別 | 臟讀 | 不可重復讀 | 幻讀 |
未提交讀(RU) | 存在 | 存在 | 存在 |
已提交讀(RC) | 不存在 | 存在 | 存在 |
可重復讀(RR) | 不存在 | 不存在 | 存在 |
可序列化(Serializable) | 不存在 | 不存在 | 不存在 |
對于已提交讀和可重復讀隔離級別的事務來說,MVCC是通過undo log和ReadView來實現的,區別在于創建Read View的時機不同。
已提交讀:在每個select語句執行前生成Read View
可重復讀:在第一個select語句執行前生成Read View
鑒于作者水平有限,文章可能存在錯誤
如有指正,十分感謝