MVCC(多版本并发控制)是数据库中用以实现事务Lock-Free的方式之一。相对于传统的两段锁等方式的事务并发处理机制,MVCC在读写同时操作时并不需要加锁,而只在两个写操作同时进行时,才加一个互斥锁。其实现思想是展示给每个事务该事务开始时数据库的快照。
有两种实现MVCC的方法:
1.保留数据修改过的所有版本
2.保留数据修改过的一部分版本(通过一个“回滚段”)
其中,PostGreSQL使用的是前一种方法。
最近将陆续更新PostGreSQL的MVCC算法详情。
相关文章:
- PostGreSQL之MVCC代码分析(1):概览 Transaction启动时形成快照就是要记录该Transaction可见的TransactionID,排除不可见的ID。PostGreSQL中每一个版本的数据有两个ID,其中一个是CreationID即插入该数据的TransactionID,一个是ExpiredID,即删除或更新该数据的TransactionID。对一个Transaction可见的数据的ID要满足以下条件: 1.CreationID当前TransactionID或ExpiredID不存在 Transaction启动形成快照的过程: 遍历当前所有活动的Transaction,记录在一个活动Transaction的ID数组中;根据Transaction的先后顺序,选择当前Transaction可见的最小TransactionID,记录在xmin,选择可见的最大TransactionID,记录在xmax中。 PostGreSQL8.5中进行最终的版本选择是在从外存中获取一个页面的数据之后,由一个检验函数(HeapTupleSatisfiesMVCC等一系列函数)检验所有该页面数据的数据对当前Transaction的可见性,如果不可见,则将数据除去,最后返回所有可见数据。继续阅读 »...
- PostGreSQL之MVCC分析终结篇 从9月中旬开始的PostGreSQL代码阅读+MVCC,至今总算告一段落。此次分析,既有意料之中,亦有出乎意料。意料之中的是过程复杂曲折,意料之外的是PostGreSQL的MVCC实现居然如此简单。继续阅读 »...
- The 200th 这是本博客的第200篇日志。距离大树底下博文过百已经过去了将近一年。 我本以为,这一次不会再有刚过百时那种激动和喜悦,但当日志更新到第197篇的时候,我的心里居然开始忐忑,有一种难明的情绪在心里,不是波涛汹涌,但也难以抑制。我想,可能不是因为博客本身,而是因为大树底下见证了过去一年的生活。继续阅读 »...