postgresql 多版本并发控制(MCC)
postgresql作为一款完全支持事务处理与商业应用的开源数据库,了解事务的管理方式对使用postgresql有重要作用。
Postgres用多版本并发控制方式管理事务(Multiversion concurrency control),这点上与Oracle非常相似,后者也采用多版本并发控制机制。
MCC的特点:(通俗点儿)
读不产生独占锁,可以共享,不影响其他事务的读写;
写产生独占锁,数据可以共享,不影响读,但不能同时写;
MCC的目的就是最大化实现并发对数据的访问,postgresql与oracle实现的效果相同,只是方式不同。实质是对事务修改数据的管理方式采用不同方式。
postgresql将修改前后的数据都存储在相同的结构中(新旧版本都存在表中)。两个事务同时访问记录时,通过参考tmin和tmax的标记判断记录的版本,根据版本号与自己当前的事务标识比较,确定自己的数据权限。当事务发生修改或者删除记录后,空间没有立即释放,实质并没有在原来的存储位置上进行更新,而是使用了新的存储空间。系统通过周期性的运行vaccum进程来回收之前的存储空间(与Java虚拟机的垃圾回收机制有点象)。事务提交前,只需要访问原来的数据即可;提交后,系统更新元组的存储标识,直到vaccum进程收回为止。
oracle也是根据事务标识的比较确认数据访问权限。当事务发生修改或者删除记录,oracle将原数据存储在undo段中,事务提交后直接更新相应记录的存储位置,并没有直接使用新的存储空间。oracle的undo段同样用于数据库的介质恢复,在应用完redo日志后(前滚),通过应用undo段中的事务,对数据库进行回滚。
oracle在10g中引入的flashback功能中的flashback drop功能与postgresql的方式就有点类似,只是针对表进行删除标记,并没有释放表所占用的空间,通过对表进行改名。在数据库管理员进行recyclebin操作后,才能释放表所占空间。
postgresql尽管是分配新的空间,对空间的分配很快。在postgresql中也有相应的参数对其进行限制,当更新的数据达到一定的程度时将会直接出发vacuum进行,直接释放掉原来的空间。postgresql与oracle对delete操作产生的空间使用,基本相同。对update操作产生的空间使用不同,相对oracle来说,postgresql可能会产生更多的行迁移或迁移的,这样对性能影响应该是存在的。