MySQL MVCC 概述
生活随笔
收集整理的這篇文章主要介紹了
MySQL MVCC 概述
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- MVCC(Muti Version Concurrency Control) 的概念
- 什么是當前讀和快照讀
- 背景
- 總結
- undo 日志
- InnoDB 中的 MVCC
- InnoDB 中的 MVCC 與事務隔離級別的關系
- InnoDB 中的 MVCC 實現原理
MVCC(Muti Version Concurrency Control) 的概念
MVCC, 是一種多版本并發控制機制。通過 MVCC ,可以極大地提升數據庫的操作并發量, 在不同的數據庫, 不同的存儲引擎中的實現方法也不一樣, 大都是基于樂觀鎖和悲觀鎖來實現的。
什么是當前讀和快照讀
- 當前讀
當前讀意思就是讀取的是記錄的最新版本,讀取時還要保證其他并發事務不能修改當前記錄, 會對讀取的記錄進行加鎖。
像 select lock in share mode(共享鎖), select for update, update, insert , delete(排他鎖),這些操作都是當前讀的一種。 - 快照讀
快照讀即不加鎖的非阻塞讀, 讀取的是當前事務下第一次執行 select 時最新的版本, 注意區別, 這里的當前事務下第一次執行 select 時最新的版本并不能保證是最新的版本,如果在當前事務下執行第一次 select 之后, 有其他事務對記錄進行了修改并提交,則當前讀的記錄版本則變成了歷史版本。
快照讀的前提是事務隔離級別不是串行級別, 串行下的快照讀將會退化成當前讀。快照讀是基于提高并發性能考慮的,是基于 MVCC 來實現的。
背景
最早的數據庫系統,只有讀讀之間可以并發,讀寫,寫讀,寫寫之間都要阻塞。在引入 MVCC 之后,只有寫寫之間相互阻塞,其他的三種操作都可以并行,這樣大幅度提高了 InnoDB 的并發量。
總結
MVCC 就是為了實現讀-寫沖突不加鎖, 將當前讀變成了快照讀。當前讀實際上是一種加鎖的操作,是悲觀鎖的實現。 MVCC 的核心理念就是維持一條記錄的多個版本, 使得讀寫操作沒有沖突。undo 日志
undo log 主要分為兩種:
- insert undo log
代表事務在 insert 新記錄時產生的 undo log, 只在事務回滾時需要,并且在事務提交后可以被立即丟棄。 - update undo log
代表事務在進行 update 或 delete 時產生的 undo log ,不僅在事務回滾時需要,在快照讀時也需要,所以不能隨便刪除,只有在快照讀或事務回滾不涉及該日志時,對應的日志才會被 purge 線程同一清除。
關于 MySQL purge 線程的介紹,請移步 MySQL purge 線程.md。
InnoDB 中的 MVCC
InnoDB 中的 MVCC 與事務隔離級別的關系
MySQ 中支持 MVCC 的引擎是 InnoDB,且 MVCC 只在 READ_COMMITED 和 REPEATABLE_READ 兩個隔離級別下工作。
MVCC 的作用用簡單的話概括就是對數據庫的任何修改的提交都不會直接覆蓋之前的數據,而是產生一個新的版本與老版本共存,使得讀數據的時候可以完全不用加鎖。這樣讀某一個數據時,事務可以根據當下的隔離級別來選擇讀取哪個版本的數據,這個過程中完全不需要加鎖。所以根據這個思想,實現兩個隔離級別就變得非常容易:
- READ_COMMITTED: 一個事務讀取數據時總是讀取這個數據最近一次被 commit 的版本。
- REPEATABLE_READ: 一個事務讀取數據時總是讀取當前事務開始之前最后一次被 commit 的版本。
InnoDB 中的 MVCC 實現原理
InnoDB 中每行有三個隱藏列:
- 6Byte, DB_TRX_ID : 行事務 ID, 記錄的是上一次記錄增刪改被提交后的事務 ID, 就是被經常提起的創建版本號和刪除版本號;
- 7Byte, DB_ROLL_PTR : 回滾指針, 指向 undo_log, undo_log 存儲于 rollback segment 區域, 用于保存事務開始之前的快照;
- 6Byte, DB_ROW_ID : 行 ID, 可以理解為隱藏的主鍵, 插入新行時單調遞增。
總結
以上是生活随笔為你收集整理的MySQL MVCC 概述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VisualStudio C++内存泄漏
- 下一篇: java访问本地文件_java 读取本地