mvcc,multi-version concurrency control,多版本併發控制,是mysql的預設儲存引擎innodb實現隔離級別的一種具體方式,能夠實現提交讀/read-committed和可重複讀/repeatable-read兩種隔離級別。
mvcc指的就是在使用 read committdrepeatable read這兩種隔離級別的事務在執行普通的 select 操作時,訪問記錄的版本鏈的過程。可以使不同事務的讀-寫、寫-讀操作併發執行,從而提公升系統效能。
對於使用 innodb 儲存引擎的表來說,它的聚簇索引記錄中都包含兩個必要的隱藏列:
readview的四個主要內容:
-資料多版本(mvcc)是mysql實現高效能的乙個主要的方式,通過對普通的select不加鎖,直接利用mvcc讀取指定版本的值,避免了對資料重複加鎖的過程.
在實際場景中讀操作往往多於寫操作,而 mvcc 利用了多版本的思想,寫操作更新最新的版本快照,而讀操作去讀舊版本快照,沒有互斥關係。
mvcc 的多版本指的是多個版本的快照,快照儲存在 undo 日誌中,該日誌通過2.1介紹的回滾指標 roll_ptr 把乙個資料行的所有快照連線起來。
insert
into t(id, x)
values(1
,"a");
update t set x=
"b"where id=1;
update t set x=
"c"where id=
1;
因為沒有使用start transaction
將上面的操作當成乙個事務來執行,根據 mysql 的 autocommit 機制,每個操作都會被當成乙個事務來執行,所以上面的操作總共涉及到三個事務。快照中除了記錄事務版本號 trx_id 和操作之外,還記錄了乙個 bit 的 del 字段,用於標記是否被刪除。
insert、update、delete 操作會建立乙個日誌,並將事務版本號 trx_id 寫入。delete 可以看成是乙個特殊的 update,還會額外將 del 字段設定為 1。
mvcc 維護了乙個 readview 結構,主要包含了當前系統未提交的事務列表 trx_ids ,還有該列表的最小值 trx_id_min 和 trx_id_max。
在進行 select 操作時,根據資料行快照的 trx_id 與 trx_id_min 和 trx_id_max 之間的關係,從而判斷資料行快照是否可以使用:
在資料行快照不可使用的情況下,需要沿著 undo log 的回滾指標 roll_ptr 找到下乙個快照,再進行上面的判斷。
mvcc 的 select 操作是快照中的資料,不需要進行加鎖操作。
select
*from
table..
.;
mvcc 其它會對資料庫進行修改的操作(insert、update、delete)需要進行加鎖操作,從而讀取最新的資料。可以看到 mvcc 並不是完全不用加鎖,而只是避免了 select 的加鎖操作。
insert
;update
;delete
;
在進行 select 操作時,可以強制指定進行加鎖操作。以下第乙個語句需要加 s 鎖,第二個需要加 x 鎖。
select
*from
table
where ? lock
inshare
mode
;select
*from
table
where ? for
update
;
mysql mvcc知乎 mysql MVCC實現
mysql5.7 關於mvcc的官方文件14.3 innodb multi versioning dev.mysql.com 自己翻譯部分需要的資訊 innodb是乙個多版本儲存引擎 它儲存了修改記錄的歷史版本資訊,以便支援事務的併發和回滾功能。這些資訊儲存在表空間的回滾字段中。innodb使用回滾...
mysql mvcc學習總結
1 mvcc multiversion concurrency control 多版本併發控制,用來實現事務的隔離,使用mvcc本質上是為了在進行讀操作的時候代替加鎖,減少加鎖帶來的負擔。2 適用的事務級別 read committed和repeatable read 3 資料結構 redo log...
Activity Intent深入解析
學習android sdk有段時間了,對activity intent的學習與使用都比較了解。第一次完整的學習activity intent後,我就感覺這似乎與windows com技術有些似曾相識的感覺,寫了一篇將activity 與 com 做了比較,但是一直感覺意猶未盡,前幾天在程式設計師雜誌...