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