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