深入浅出PostgreSQL之浅谈MVCC
一、MVCC的简介以及实现方式
多版本并发控制(Multi-Version Concurrency Control),简称MVCC,在大多数关系型数据库中都支持MVCC特性。
MVCC主要用来提高并发性,实现读写相互不阻塞的目标。
在这里说明一下并发控制机制的种类:
1、基于锁的并发控制机制称为悲观机制
2、基于MVCC的并发控制机制称为乐观机制
而MVCC的实现方式有以下两种:
1、将旧版本的数据单独存放到一个空间,一个事务如果想读取旧版本的数据就从这个地方将数据读出来。例如MySQL的innodb引擎或者Oracle数据库都是将旧版本的数据放到undo段中的。
2、第二种就是旧版本的数据不删除,插入新数据;旧数据确认没有用时再由autovacuum来清理,PostgreSQL就是使用这种方式。
二、MVCC的原理
1、先简单介绍几个相关的概念便于理解
事务ID(XID)用32位无符号数来表示,依次增加1;
为了实现MVCC,每张表上添加了(tmin,tmax)这两个字段
tmin存储的是insert或者update这个元组的书屋ID,tmax存储的是删除这个元组的事务ID。tmin和tmax就标志着这个元组的有效性了(判断tmiin和tmax对应的事务是commit还是rollback)
2、原理
当有事务读取某个元组时,先比较当前的事务ID和tmin的大小,只有当前事务的ID大于tmin并且这个元组没有被删除才能读的到。
三、PostgreSQL中的MVCC相比于其他数据库的优劣势
优势;
1、由于旧版本的数据不在undo段中,数据的更改记录都在表文件中,所以PostgreSQL数据库事务发生回滚可以立即完成(不论这个事务是不是大事务)。
2、数据能够进行大量的更新,不像MySQL的innodb引擎和Oracle数据更新先将更改前的数据放到undo空间中去(undo空间的暴增数据库性能会很差,所以不能肆无忌惮的更新数据)。
劣势;
1、大量的旧版本数据占用磁盘空间降低了查询性能(需要扫描更多的数据块)
2、事务ID个数有限制