淘寶客做的比較好的網(wǎng)站友情鏈接有哪些作用
MVCC機制
使用MVCC(Multi-Version Concurrency Control,多版本的并發(fā)控制協(xié)議)機制來實現(xiàn)可重復讀(REPEATABLE READ)的隔離級別
MVCC最大的優(yōu)點是讀不加鎖,因此讀寫不沖突,并發(fā)性能好。InnoDB實現(xiàn)MVCC,是通過保存數(shù)據(jù)在某個時間點的快照來實現(xiàn)的,多個版本的數(shù)據(jù)可以共存,主要是依靠數(shù)據(jù)的四個隱藏列(也可以稱之為標記位)和undo log。其中數(shù)據(jù)的隱藏列包括了隱含的自增主鍵(DB_ROW_ID),最近更改的事務ID(DB_TRX_ID)、undo log的指針(DB_ROLL_PTR)、索引刪除標記(FLAG數(shù)據(jù)被刪除時,并不是立即刪除,而是打上刪除標記,進行異步刪除);在進行數(shù)據(jù)修改時,當前記錄會進行加鎖,把修改前的數(shù)據(jù)放入undo log中,通過undo log的指針與數(shù)據(jù)進行關(guān)聯(lián),如果修改失敗,則恢復undo log中的數(shù)據(jù)
事務對一條數(shù)據(jù)進行修改時,undolog日志會成為一條記錄版本的鏈表,鏈首是最新的舊記錄,鏈尾是最早的舊記錄
事務隔離級別READ COMMITTED時,對于快照數(shù)據(jù),總是讀取被鎖定行的最新一份快照數(shù)據(jù)
事務隔離級別REPEATABLEREAD時,對于快照數(shù)據(jù),總是讀取事務開始時的行數(shù)據(jù)版本
ReadView
ReadView包含四個字段
-
m_ids 當前活躍的事務id集合 -
min_trx_id 最小活躍事務id -
max_trx_id 最大事務id,已創(chuàng)建的最大事務id -
creator_trx_id 快照讀創(chuàng)建者的事務id
在READ UNCOMMITED的隔離級別下,select都是當前讀;而在SERIALIZABLE級別下,是通過表鎖來限制數(shù)據(jù),所以MVCC是在READ COMMITED和REPEATABLE READ的級別下才會生效
在READ COMMITED級別下,每一次select都會重新將系統(tǒng)中所有活躍事務拷貝到每一個列表中生成ReadView。
在REPEATABLE READ級別下,每個事務read時,會將當前系統(tǒng)中所有活躍事務拷貝到一個列表中生成ReadView,后續(xù)所有select都復用該ReadView
當執(zhí)行查詢sql時會生成一致性視圖ReadView,它是由執(zhí)行查詢時所有未提交事務id數(shù)組(m_ids)和已創(chuàng)建的最大事務id(max_trx_id)組成,查詢的數(shù)據(jù)結(jié)果需要跟ReadView做對比從而得到快照結(jié)果
https://zhhll.icu/2021/數(shù)據(jù)庫/關(guān)系型數(shù)據(jù)庫/MySQL/進階/24.MVCC機制/
本文由 mdnice 多平臺發(fā)布