1.MVCC模型图形说明
传统模式:
类似悲观锁,并发效率低下。
MVCC处理模式:
加版本,单个写操作会将数据复制一份新的版本,不会阻塞,并发效率高。
pgsql事务隔离性就是通过上图的数据的多版本来保证。
MVCC老版本数据处理:
每张表都有 free space map,它记录文件存储的可用空间情况。FSM 不是很准确,因为它以8KB来计算,并且不是实时更新的,它是由 VACUUM 更新的。在 MVCC 情况下,update 和 delete 后,旧的数据快照不会立即删除,VACUUM会释放空间以重用或还给操作系统。
3.预写日志WAL
1.在更新数据前,把操作的信息及数据以日志的形式写到磁盘。
2.只有日志实际写到硬盘后,数据才会被认为是安全的。
3.当数据没有被写到磁盘时,系统崩溃,日志重做更新数据,保证事物原子性。
WAL通常位于pg_wal目录下,老版本的位于pg_xlog目录。
每个事务日志文件的大小都是16 MB,文件名是24位的16进制数字。
WAL事务日志记录形式:
通过WAL改进性能:
预写式日志(WAL)是一种实现事务日志的标准方法。有关它的详细描述可以在大多数(如果不是全部的话)有关事务处理的书中找到。简而言之,WAL 的中心思想是对数据文件的修改(它们是表和索引的载体)必须是只能发生在这些修改已经记录到日志之后,也就是说,在描述这些变化的日志记录刷新到永久存储器之后。如果我们遵循这个过程,那么就不需要在每次事务提交的时候都把数据页刷新到磁盘,因为在出现崩溃的情况下可以用日志来恢复数据库:任何尚未附加到数据页的记录都将先从日志记录中重做(这叫向前滚动恢复,也叫 REDO)。
使用 WAL 的第一个主要的好处就是显著地减少了磁盘写的次数。因为在日志提交的时候只有日志文件需要刷新到磁盘;而不是事务修改的所有数据文件。在多用户环境里,许多事务的提交可以用日志文件的一次 fsync 来完成。而且,因为日志文件是顺序写的,所以同步日志的开销要远比同步数据页的开销小。对于许多小事务修改数据存储的许多不同位置更是如此。
1.随机写变顺序写
2.阻塞写变非阻塞写
事务崩溃恢复:
事务归档日志:
在检查点以前的是归档日志,在检查点之后的是活动日志。可以利用归档日志对数据库进行一个还原或者备份。
总结:
1.事务四个特性ACID(原子性、一致性、隔离性、持久性);
2.WAL预写日志保证了事务的原子性、持久性;
3.MVCC多版本并发控制保证了事务的隔离性;
4.pqgsql内部约束及规则保证事物的一致性,这里的一致性和CAP中的C是不一样的;
5.pgsql内部实现远比上面笔记记录的的复杂得多,光是pgsql实现的内部锁机制都高达十几种,这里只能算是基本认识了pgsql事务处理机制。