跳转到主要内容

PG内核

3 篇
  • PG先写脏页还是先写WAL?

    冯若航 发布于 PGSQL 2248 字 5 分钟

    冯若航PostgreSQLPG内核

    PG先写脏页还是先写WAL?

    昨天在群里遇到一个有趣的关于 PostgreSQL 的问题: “写脏数据页和写入 WAL 缓冲区的先后顺序是什么?” 我们都知道,WAL 就是 Write Ahead Log / 预写式日志 的缩写,那从逻辑上说,好像是先写 WAL 再写数据页才对。 但其实这个问题有趣在,写入其实是发生在两个地方的:内存与磁盘。而这对这两者的写入顺序是不一样的:在内存中,先写脏数据页,再写 WAL 记录。在刷盘时,先刷 WAL 记录,再刷脏数据页。 我们可以用一个简单的例子来说明,当你执行一条 INSERT 时 …

    昨天在群里遇到一个有趣的关于 PostgreSQL 的问题: “写脏数据页和写入 WAL 缓冲区的先后顺序是什么?” 我们都知道,WAL 就是 Write Ahead Log / 预写式日志 的缩写,那从逻辑上说,好像是先写 WAL 再写数据页才对。 但其实这个问题有趣在,写入其实是发生在两个地方的:内存与磁盘。而这对这两者的写入顺序是不一样的:在内存中,先写脏数据页,再写 WAL 记录。在刷盘时,先刷 WAL 记录,再刷脏数据页。 我们可以用一个简单的例子来说明,当你执行一条 INSERT 时 …

  • 前后端通信线缆协议

    冯若航 发布于 PGSQL 1168 字 3 分钟

    冯若航PostgreSQLPG开发PG内核

    前后端通信线缆协议

    了解PostgreSQL服务器与客户端通信使用的TCP协议 启动阶段 启动阶段的基本流程如下所示: 客户端发送一条 StartupMessage (F) 向服务端发起连接请求 载荷包括 0x30000 的Int32版本号魔数,以及一系列kv结构的运行时参数(NULL0分割,必须参数为 user), 客户端等待服务端响应,主要是等待服务端发送的 ReadyForQuery (Z) 事件,该事件代表服务端已经准备好接收请求。 上面是连接建立过程中最主要的两个事件,其他事件包括包括认证消息 …

    了解PostgreSQL服务器与客户端通信使用的TCP协议 启动阶段 启动阶段的基本流程如下所示: 客户端发送一条 StartupMessage (F) 向服务端发起连接请求 载荷包括 0x30000 的Int32版本号魔数,以及一系列kv结构的运行时参数(NULL0分割,必须参数为 user), 客户端等待服务端响应,主要是等待服务端发送的 ReadyForQuery (Z) 事件,该事件代表服务端已经准备好接收请求。 上面是连接建立过程中最主要的两个事件,其他事件包括包括认证消息 …

  • 并发异常那些事

    冯若航 发布于 数据库 11898 字 24 分钟

    冯若航数据库事务PG内核

    并发异常那些事

    并发程序很难写对,更难写好。很多程序员也没有真正弄清楚这些问题,不过是一股脑地把这些问题丢给数据库而已。并发异常并不仅仅是一个理论问题:这些异常曾经造成过很多资金损失,耗费过大量财务审计人员的心血。但即使是最流行、最强大的关系型数据库(通常被认为是“ACID”数据库),也会使用弱隔离级别,所以它们也不一定能防止这些并发异常的发生。 比起盲目地依赖工具,我们应该对存在的并发问题的种类,以及如何防止这些问题有深入的理解。 本文将阐述SQL92标准中定义的隔离级别及其缺陷,现代模型中的隔离级别与定义这 …

    并发程序很难写对,更难写好。很多程序员也没有真正弄清楚这些问题,不过是一股脑地把这些问题丢给数据库而已。并发异常并不仅仅是一个理论问题:这些异常曾经造成过很多资金损失,耗费过大量财务审计人员的心血。但即使是最流行、最强大的关系型数据库(通常被认为是“ACID”数据库),也会使用弱隔离级别,所以它们也不一定能防止这些并发异常的发生。 比起盲目地依赖工具,我们应该对存在的并发问题的种类,以及如何防止这些问题有深入的理解。 本文将阐述SQL92标准中定义的隔离级别及其缺陷,现代模型中的隔离级别与定义这 …