MVCC

1 什么是MVCC

MVCC(Multiversion concurrency control),多版本并發(fā)控制協(xié)議,是數(shù)據(jù)庫(kù)中經(jīng)常使用的的一種并發(fā)控制手段。MVCC最大的好處,相信也是耳熟能詳:讀不加鎖,讀寫(xiě)不沖突。在讀多寫(xiě)少的OLTP應(yīng)用中,讀寫(xiě)不沖突是非常重要的,極大的增加了系統(tǒng)的并發(fā)性能,這也是為什么現(xiàn)階段,幾乎所有的RDBMS,都支持了MVCC。

在MVCC并發(fā)控制中,讀操作可以分成兩類(lèi):快照讀 (snapshot read)與當(dāng)前讀 (current read)。快照讀,讀取的是記錄的可見(jiàn)版本 (有可能是歷史版本),不用加鎖。當(dāng)前讀,讀取的是記錄的最新版本,并且,當(dāng)前讀返回的記錄,都會(huì)加上鎖,保證其他事務(wù)不會(huì)再并發(fā)修改這條記錄。

2 innodb中的MVCC

快照讀
簡(jiǎn)單的select操作,屬于快照讀,不加鎖。
select * from table where ?(隔離級(jí)別:serialization除外)
當(dāng)前讀
特殊的讀操作,插入/更新/刪除操作,屬于當(dāng)前讀,需要加鎖。
select * from table where ? lock in share mode;
select * from table where ? for update;
insert into table values (…);
update table set ? where ?;
delete from table where ?;
所有以上的語(yǔ)句,都屬于當(dāng)前讀,讀取記錄的最新版本。并且,讀取之后,還需要保證其他并發(fā)事務(wù)不能修改當(dāng)前記錄,對(duì)讀取記錄加鎖。其中,除了第一條語(yǔ)句,對(duì)讀取記錄加S鎖 (共享鎖)外,其他的操作,都加的是X鎖 (排它鎖)。

3 MVCC的局限

思考:既然MVCC相比LBCC(基于鎖的并發(fā)控制)有如此巨大的優(yōu)勢(shì),為什么還會(huì)有LBCC存在呢?

MVCC的作用在于以犧牲數(shù)據(jù)一致性為代價(jià),實(shí)現(xiàn)高效的并發(fā)讀(無(wú)鎖定的讀);
LBCC 的作用在于以犧牲數(shù)據(jù)并發(fā)性為代價(jià),實(shí)現(xiàn)一致的并發(fā)讀、一致的并發(fā)寫(xiě);
兩者側(cè)重點(diǎn)不同,應(yīng)用場(chǎng)景也不同;

參考:
http://blog.csdn.net/chen77716/article/details/6742128
http://www.cnblogs.com/zhaoyl/p/4121010.html
https://en.wikipedia.org/wiki/Multiversion_concurrency_control

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容