定義
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)
- 刪除的版本號(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)解決的。