8.pgsql的事务处理机制(2)

1.MVCC模型图形说明

传统模式:

8.pgsql的事务处理机制(2)_第1张图片

类似悲观锁,并发效率低下。

MVCC处理模式:

8.pgsql的事务处理机制(2)_第2张图片

加版本,单个写操作会将数据复制一份新的版本,不会阻塞,并发效率高。

pgsql事务隔离性就是通过上图的数据的多版本来保证。

MVCC老版本数据处理:

8.pgsql的事务处理机制(2)_第3张图片

每张表都有 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事务日志记录形式:

8.pgsql的事务处理机制(2)_第4张图片

通过WAL改进性能: 

       预写式日志(WAL)是一种实现事务日志的标准方法。有关它的详细描述可以在大多数(如果不是全部的话)有关事务处理的书中找到。简而言之,WAL 的中心思想是对数据文件的修改(它们是表和索引的载体)必须是只能发生在这些修改已经记录到日志之后,也就是说,在描述这些变化的日志记录刷新到永久存储器之后。如果我们遵循这个过程,那么就不需要在每次事务提交的时候都把数据页刷新到磁盘,因为在出现崩溃的情况下可以用日志来恢复数据库:任何尚未附加到数据页的记录都将先从日志记录中重做(这叫向前滚动恢复,也叫 REDO)。

使用 WAL 的第一个主要的好处就是显著地减少了磁盘写的次数。因为在日志提交的时候只有日志文件需要刷新到磁盘;而不是事务修改的所有数据文件。在多用户环境里,许多事务的提交可以用日志文件的一次 fsync 来完成。而且,因为日志文件是顺序写的,所以同步日志的开销要远比同步数据页的开销小。对于许多小事务修改数据存储的许多不同位置更是如此。

1.随机写变顺序写

2.阻塞写变非阻塞写

8.pgsql的事务处理机制(2)_第5张图片

 事务崩溃恢复:

8.pgsql的事务处理机制(2)_第6张图片

事务归档日志:

在检查点以前的是归档日志,在检查点之后的是活动日志。可以利用归档日志对数据库进行一个还原或者备份。

8.pgsql的事务处理机制(2)_第7张图片

 

总结:

1.事务四个特性ACID(原子性、一致性、隔离性、持久性);

2.WAL预写日志保证了事务的原子性、持久性;

3.MVCC多版本并发控制保证了事务的隔离性;

4.pqgsql内部约束及规则保证事物的一致性,这里的一致性和CAP中的C是不一样的;

5.pgsql内部实现远比上面笔记记录的的复杂得多,光是pgsql实现的内部锁机制都高达十几种,这里只能算是基本认识了pgsql事务处理机制。

你可能感兴趣的:(pgsql)