深入浅出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个数有限制
posted @ 2019-01-17 16:03  anthony_mei  阅读(1600)  评论(0编辑  收藏  举报