筆記來(lái)源:https://www.bilibili.com/video/BV1E44y1B77X?p=1
MVCC
多版本并發(fā)控制扼脐,提高讀寫效率
MVCC的實(shí)現(xiàn),通過保存數(shù)據(jù)在某個(gè)時(shí)間點(diǎn)的快照來(lái)實(shí)現(xiàn)的荸恕。這意味著一個(gè)事務(wù)無(wú)論運(yùn)行多長(zhǎng)時(shí)間专筷,在同一個(gè)事務(wù)里能夠看到數(shù)據(jù)一致的視圖。根據(jù)事務(wù)開始的時(shí)間不同撕攒,同時(shí)也意味著在同一個(gè)時(shí)刻不同事務(wù)看到的相同表里的數(shù)據(jù)可能是不同的陡鹃。
基礎(chǔ)知識(shí)
當(dāng)前讀
讀取的是數(shù)據(jù)的最新版本,總是讀取到最新的數(shù)據(jù)抖坪。
觸發(fā)時(shí)機(jī):
select ... lock in share mode
select ... for update
update ...
delete ...
insert ...
快照讀
讀取的是歷史版本的數(shù)據(jù)萍鲸。
觸發(fā)時(shí)機(jī):
select ...
MVCC
案例演示
MVCC包含三部分:
第一部分:隱藏字段
每一行記錄上都會(huì)包含幾個(gè)用戶不可見的字段。
- DB_TRX_ID 創(chuàng)建或者最后一次修改該記錄的事務(wù) id
- DB_ROW_ID 隱藏主鍵 【索引列的選擇過程 主鍵 ---> 唯一鍵 ---> 六字節(jié)的ROW_ID】
- DB_ROLL_ID 回滾指針 【指向上一個(gè)對(duì)應(yīng)的歷史記錄】配合 undolog 使用
插入一條記錄的數(shù)據(jù)狀態(tài):
第二部分:undolog 【回滾日志】
undolog 案例
- 事務(wù)1擦俐,插入一條新紀(jì)錄
-
事務(wù)2脊阴,修改插入的記錄,undolog 存儲(chǔ)的是歷史記錄
注意 當(dāng)前記錄 DB_TRX_ID變?yōu)楫?dāng)前事務(wù) id
DB_ROLL_PRT 指向上一個(gè)版本記錄
-
事務(wù)3蚯瞧,修改記錄
存在多個(gè)歷史版本
小結(jié):
當(dāng)不同的事務(wù)對(duì)同一條記錄做修改的時(shí)候嘿期,會(huì)導(dǎo)致該記錄的undolog 形成一個(gè)線性表,也就是鏈表埋合,鏈表首是最新的歷史記錄备徐,而鏈尾是最早的歷史記錄。
第三部分:readview 【事務(wù)在進(jìn)行快照讀的時(shí)候產(chǎn)生的讀視圖】
readview 包含以下幾部分:
- trx_list 當(dāng)前系統(tǒng)活躍的事務(wù)id
- up_limit_id 列表中事務(wù)最小id
- low_limit_id 系統(tǒng)尚未分配的下一個(gè)事務(wù)id
實(shí)際場(chǎng)景1:
事務(wù)1 | 事務(wù)2 | 事務(wù)3 | 事務(wù)4 |
---|---|---|---|
開啟事務(wù) | 開啟事務(wù) | 開啟事務(wù) | 開啟事務(wù) |
修改某一個(gè)值<br />commit | |||
快照讀 |
事務(wù)2能否讀取到剛剛修改的記錄值甚颂?
可以讀取到
可見性判斷
RC蜜猾、RR readview 生成時(shí)機(jī)
實(shí)際場(chǎng)景2:
事務(wù)0 | 事務(wù)1 | 事務(wù)2 | 事務(wù)3 | 事務(wù)4 |
---|---|---|---|---|
開啟事務(wù)<br />插入<br />提交 | 開啟事務(wù) | 開啟事務(wù)<br />快照讀 | 開啟事務(wù) | 開啟事務(wù) |
修改某一個(gè)值<br />commit | ||||
快照讀 |
事務(wù)2能否讀取到剛剛修改的記錄值秀菱?
不可以讀取到
可見性判斷1:
當(dāng)事務(wù)2,進(jìn)行第一次快照讀時(shí)【能夠讀取到事務(wù)0蹭睡,插入的數(shù)據(jù)】
可見性判斷2:
當(dāng)事務(wù)4衍菱,進(jìn)行修改提交之后,事務(wù)2再次進(jìn)行快照讀棠笑,在 RR 隔離級(jí)別下梦碗,不會(huì)重新生成readview,使用的還是之前的readview
RR 始終讀的是第一次快照讀嗎蓖救?
第五步執(zhí)行的是當(dāng)前讀【快照重新生成洪规,產(chǎn)生了幻讀的問題】,所以更新數(shù)據(jù)為4條循捺。第五步之后再次查詢斩例,查詢的也是四條記錄。
MySQL事務(wù)的四大特性:
原子性:通過undolog 實(shí)現(xiàn)从橘。
隔離性:通過MVCC 實(shí)現(xiàn)念赶。
持久性:通過redolog 實(shí)現(xiàn)。涉及到二階段體提交
一致性:是數(shù)據(jù)庫(kù)的根本要求恰力,其他三個(gè)特性共同實(shí)現(xiàn)了一致性叉谜。
二階段提交
數(shù)據(jù)更新流程:
如果兩個(gè)日志只有一個(gè)寫成功了,會(huì)出現(xiàn)什么問題踩萎?