我正在学习EDB PostgreSQL 基础课程,讲师解释了 PostgreSQL 架构,并参考该图,每当客户端发出更新请求并假设数据存在于共享缓冲区中(这意味着无需从文件存储中获取数据),那么它'将在 WAL 缓冲区中创建一个条目,并在提交时,WAL 编写器会将事务写入事务日志并使其永久化,但不会在文件系统中(据我所知,这是下面checkpointer的任务。)到目前为止超好的。
图片由 traning.enterprisedb.com 提供
现在出现了检查指针,它是一个在每隔一定时间间隔“通常5分钟是理想时间”后运行的进程,并将共享缓冲区中的任何内容写入文件存储。
我的问题是,假设 checkpointer 刚刚运行,然后我发起了一个原子交易并转了 100 美元给我的朋友,我的朋友如何立即看到它,Postgres 是否正在查询交易日志?或者说,这是怎么回事?
但经过一番思考,我意识到,当请求更新数据并为了更新它时,Postgres 已将其带入主内存,一种可行的方法是跟踪共享缓冲区中的脏数据,并更新共享缓冲区本身以及事务日志中的数据,我们可以使用0/1
每个 DML 事务条目来识别数据是否存在于共享缓冲区中。这在进行分析时也可以派上用场。
有人可以帮我理解吗?提前致谢!
表页和索引页等数据始终通过shared_buffers 访问。唯一一次在磁盘上直接访问它们的时候是将它们复制到shared_buffers中,或者从shared_buffers中清理回磁盘时。因此,没有“跟踪”它是否需要检查shared_buffers,因为它总是需要检查shared_buffers。
当更改完成时,更改首先在shared_buffers中完成,然后将该更改的记录写入WAL日志缓冲区(这两个操作紧密耦合)。然后将WAL日志写入并刷新到磁盘,然后将shared_buffers中的脏数据写入磁盘。这些操作并不是紧密耦合的,它们可能相隔数秒或数分钟,但它们始终按照列出的顺序完成。
在更新完成和脏页被写回(可能是通过检查指针或其他东西)之间,它被锁定到shared_buffers中。它在被写入之前不能被逐出,并且在保护它的 WAL 记录被写入并刷新之前也不能被写入。
因此,当你的朋友在你提交后立即检查他的余额时,它是从锁定到共享缓冲区的“脏”表数据中检查的。