摘要:
我们知道,在数据库中为了并发控制,少不了要使用各种各样的锁(lock)。PostgreSQL中也不例外。 在PostgreSQL中有三种级别的锁,他们的关系如下: 那么按照顺序,我们先来讨论下PostgreSQL的最底层的SpinLock。 作为PostgreSQL的最底层的锁,SpinLock比较 阅读全文
摘要:
"上文" 我们讨论了PostgreSQL的MVCC相关的基础知识以及实现机制。关于PostgreSQL中的MVCC,我们只讲了元组可见性的问题,还剩下两个问题没讲。一个是"Lost Update"问题,另一个是PostgreSQL中的序列化快照隔离机制(SSI,Serializable Snapsh 阅读全文
摘要:
PostgreSQL为开发者提供了一组丰富的工具来管理对数据的并发访问。在内部,数据一致性通过使用一种多版本模型(多版本并发控制,MVCC)来维护。这就意味着每个 SQL 语句看到的都只是一小段时间之前的数据快照(一个数据库版本),而不管底层数据的当前状态。这样可以保护语句不会看到可能由其他在相同数 阅读全文
摘要:
在 PostgreSQL中,每一个进程都有属于自己的共享缓存(shared cache)。例如,同一个系统表在不同的进程中都有对应的Cache来缓存它的元组(对于RelCache来说缓存的是一个RelationData结构)。同一个系统表的元组可能同时被多个进程的Cache所缓存,当其中某个Cach 阅读全文
摘要:
本文源于最近修正的一个关于psqlodbc的bug,该bug在近期的psqlodbc的git上也有人提交了修正。 关于该bug的修正代码可以看这里: "https://git.postgresql.org/gitweb/?p=psqlodbc.git;a=commit;h=85f6fade3" 说道 阅读全文
摘要:
今天我们对postmaster的以下细节进行讨论: 2.与前端的交互 2.1backend的启动和client的连接请求的认证 关于backend的启动,其函数调用栈如下: typedef struct bkend { pid_t pid; / process id of backend / lon 阅读全文
摘要:
之前我的一些文章都是在说Postgres的一些查询相关的代码。但是对于Postgres服务端是如何启动,后台进程是如何加载,服务端在哪里以及如何监听客户端的连接都没有一个清晰的逻辑。那么今天我来说说Postgres中的 postmaster 模块的代码,试着解答这些问题。 在正式讨论之前,我先说一下 阅读全文
摘要:
回滚 n 个 commit (增加了revert commit) git revert n commit_id 回滚到指定的commit_id(不增加commit,回滚的commit_id被删除) git reset hard commit_id 回到commit_id处,在这里可以修改在这个com 阅读全文
摘要:
5.ModifyTable节点 先看一个ModifyTable节点的例子: 你可能疑惑为啥上面的查询计划里面没有"ModifyTable"这样的字眼,下面是explain.c文件中的一段: 由此我们可以看到,对于ModifyTable节点,explain会判断是增删改中的哪一种从而作出判断。所以当在 阅读全文
摘要:
控制节点 控制节点用于完成一些特殊的流程执行方式。由于PostgreSQL为査询语句生成二叉树状的査询计划,其中大部分节点的执行过程需要两个以内的输入和一个输出。但有一些特殊的功能为了优化的需要,会含有特殊的执行方式和输人需求(例如对于update、INSERT和DELETE,在普通的SELECT基 阅读全文