mysql之MVCC的原理

定義

MVCC:
Multiversion concurrency control (多版本并發(fā)控制)

白話解釋: 并發(fā)訪問(wèn)(讀或?qū)?數(shù)據(jù)庫(kù)時(shí),對(duì)正在事務(wù)內(nèi)處理的數(shù)據(jù)做多版本的管理,以達(dá)到用來(lái)避免寫(xiě)操作的堵塞,從而引發(fā)讀操作的并發(fā)問(wèn)題。

MVCC的邏輯流程

在我們的每一個(gè)表中的,會(huì)默認(rèn)生成三列隱藏的數(shù)據(jù),其中跟MVCC相關(guān)的只有兩列,如下:

1.數(shù)據(jù)行的版本號(hào)(DA_TRX_ID)也就是該記錄入庫(kù)的版本號(hào)

  1. 刪除的版本號(hào)(DB_ROLL_PT)

插入數(shù)據(jù)時(shí)



如下圖,插入數(shù)據(jù)時(shí),此時(shí)事務(wù)未提交,此時(shí)會(huì)把該操作事務(wù)的ID作為數(shù)據(jù)行的版本號(hào)。

刪除數(shù)據(jù)時(shí)


修改數(shù)據(jù)時(shí)



其實(shí)是相當(dāng)如把修改的數(shù)據(jù)復(fù)制一份,此時(shí)事務(wù)id作為刪除版本號(hào),然后插入新的記錄,數(shù)據(jù)行的版本號(hào)為刪除的版本號(hào),再把原來(lái)的數(shù)據(jù)刪除。

查詢的邏輯流程

然后我們來(lái)看下以下的案例:

數(shù)據(jù)準(zhǔn)備:
前提,先執(zhí)行插入兩條數(shù)據(jù),并且提交。
insert into teacher(name,age) value ('seven',18) ;
insert into teacher(name,age) value ('qing',20) ;

tx1:
begin; ----------1
select * from users ; ----------2
commit;
tx2:
begin; ----------3
update teacher set age =28 where id =1; ----------4
commit;

案例1

執(zhí)行順序?yàn)? 1,2,3,4,2



先執(zhí)行讀,不提交,再執(zhí)行3,4更新,此時(shí)再執(zhí)行2,讀。這時(shí)候讀出來(lái)的數(shù)據(jù)是未提交前的,符合邏輯。
這時(shí)存在臟讀。

案例2
執(zhí)行順序?yàn)? 3,4,1,2


先執(zhí)行3,4,更新字段,不提交。然后再執(zhí)行讀,此時(shí),讀出來(lái)的數(shù)據(jù)為未提交且更新后的數(shù)據(jù)。
等更新提交后,獨(dú)讀出的數(shù)據(jù)就不一致了,此情況存在不可重復(fù)度。

所以我們可以知道,他解決臟讀,不可重復(fù)讀不是通過(guò)MVCC來(lái)解決的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容