1 什么是MVCC
MVCC(Multiversion concurrency control),多版本并發(fā)控制協(xié)議,是數(shù)據(jù)庫中經(jīng)常使用的的一種并發(fā)控制手段。MVCC最大的好處,相信也是耳熟能詳:讀不加鎖,讀寫不沖突。在讀多寫少的OLTP應用中,讀寫不沖突是非常重要的,極大的增加了系統(tǒng)的并發(fā)性能,這也是為什么現(xiàn)階段,幾乎所有的RDBMS,都支持了MVCC。
在MVCC并發(fā)控制中,讀操作可以分成兩類:快照讀 (snapshot read)與當前讀 (current read)。快照讀,讀取的是記錄的可見版本 (有可能是歷史版本),不用加鎖。當前讀,讀取的是記錄的最新版本,并且,當前讀返回的記錄,都會加上鎖,保證其他事務不會再并發(fā)修改這條記錄。
2 innodb中的MVCC
快照讀:
簡單的select操作,屬于快照讀,不加鎖。
select * from table where ?(隔離級別:serialization除外)
當前讀:
特殊的讀操作,插入/更新/刪除操作,屬于當前讀,需要加鎖。
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 ?;
所有以上的語句,都屬于當前讀,讀取記錄的最新版本。并且,讀取之后,還需要保證其他并發(fā)事務不能修改當前記錄,對讀取記錄加鎖。其中,除了第一條語句,對讀取記錄加S鎖 (共享鎖)外,其他的操作,都加的是X鎖 (排它鎖)。
3 MVCC的局限
思考:既然MVCC相比LBCC(基于鎖的并發(fā)控制)有如此巨大的優(yōu)勢,為什么還會有LBCC存在呢?
MVCC的作用在于以犧牲數(shù)據(jù)一致性為代價,實現(xiàn)高效的并發(fā)讀(無鎖定的讀);
LBCC 的作用在于以犧牲數(shù)據(jù)并發(fā)性為代價,實現(xiàn)一致的并發(fā)讀、一致的并發(fā)寫;
兩者側(cè)重點不同,應用場景也不同;
參考:
http://blog.csdn.net/chen77716/article/details/6742128
http://www.cnblogs.com/zhaoyl/p/4121010.html
https://en.wikipedia.org/wiki/Multiversion_concurrency_control