多版本并发控制的原理
在并发操作中,当正在写时,如果用户在读,可能会产生数据不一致的问题。比如一行的前半部分刚写入,后半部分还没有写入,这时读的人可能读取到的数据行,其前半部分数据是新的,后半部分数据是旧的,这样就导致了数据一致性问题。解决这个问题最简单的办法是使用读写锁。写的时候,不允许读,正在读的时候也不允许写,但这种方法导致读和写不能并发。于是,有人想到了一种能够让读写并发的方法(MVCC)。
实现MVCC的方法有两种
1、写数据时,把旧数据移到一个单独的地方,如回滚段中,其他人读数据时,从回滚段中把旧的数据读出来。
2、写数据时,旧数据不删除,而是把新数据插入。
PostgreSQL数据库使用的是第二种方法,而Oracle和MySQL中的innodb引擎使用的是第一种方法。
PostgreSQL中多版本并发控制
PostgreSQL中是通过把旧数据留在数据文件中,新插入一条数据来实现多版本功能,为实现该功能,没长表上都添加了四个系统字段tmin、tmax、cmin、cmax。当两个事物同事访问记录时,通过参考tmin和tmax的标记可判断记录的版本,然后根据版本号与自己当前的事务标识进行比较,确定自己的数据权限。Postgresql通过运行vaccum进程回收之前的存储空间解决旧数据的空间释放问题。
在Postgresql中,处于效率的考虑。若事务失败,事务产生的数据不会在事务回滚时被清理,而是标记为无效。通过记录事务的状态,Postgresql可以判断数据是否有效。