?在Mysql中MVCC是在Innodb存儲(chǔ)引擎中得到支持的 Innodb是支持事務(wù)的
在Mysql的隔離級(jí)別中 讀已提交 和 可重讀 隔離級(jí)別是利用MVCC機(jī)制實(shí)現(xiàn)的隔離級(jí)別
MVCC主要是用了undo日志和read view 著重的講這兩個(gè)
undo日志
undo日志也是undo回滾日志? 他會(huì)生成一個(gè)版本鏈
undo日志會(huì)為一個(gè)數(shù)據(jù)修改前后的數(shù)據(jù)記錄下來(lái)蜀备,并把修改他的事務(wù)id一并也給記錄下來(lái)
事務(wù)id會(huì)在一個(gè)事務(wù)進(jìn)行一次修改后獲得缰盏,并不是創(chuàng)建這個(gè)事務(wù)后就有荚板。
read-view
在可重復(fù)讀隔離級(jí)別撬陵,當(dāng)事務(wù)開(kāi)啟,執(zhí)行任何查詢sql時(shí)會(huì)生成當(dāng)前事務(wù)的一致性視圖read-view村砂,該視圖在事務(wù)結(jié)束之前都不會(huì)變化(如果是讀已提交隔離級(jí)別在每次執(zhí)行查詢sql時(shí)都會(huì)重新生成)寄月,這個(gè)視圖由執(zhí)行查詢時(shí)所有未提交事務(wù)id數(shù)組(數(shù)組里最小的id為min_id)和已創(chuàng)建的最大事務(wù)id(max_id)組成,事務(wù)里的任何sql查詢結(jié)果需要從對(duì)應(yīng)版本鏈里的最新數(shù)據(jù)開(kāi)始逐條跟一致性視圖read-view做比對(duì)從而得到最終的快照結(jié)果贤重。
例如:在可重讀級(jí)別下 當(dāng)我生成一個(gè)read-view后別的事務(wù)修改了一條數(shù)據(jù),當(dāng)我再次查找的數(shù)據(jù)時(shí)會(huì)把undo日志內(nèi)的事務(wù)id和生成的read-view內(nèi)的事務(wù)id相對(duì)比清焕,如果發(fā)現(xiàn)你是在我視圖里標(biāo)記為未提交事務(wù)那么這條數(shù)據(jù)就是不可見(jiàn)的并蝗,逐條去比較直到找到那個(gè)在read-view內(nèi)不是在未提交下的事務(wù)id,那行記錄才會(huì)顯示出