PostgreSQL订阅服务器在同步到发布服务器的更新时会锁定吗



如果我有3个数据库

  • Db1:仅用于写入,发布者
    • Db2:仅用于读取,订阅Db1
    • Db3:仅用于读取,Db1的订阅者

只是为了澄清"仅用于读取"意味着我的应用程序不会试图修改该数据库。相反的情况适用于"仅用于写入"。我不是在谈论数据库本身的一个特性。也许我会使用权限来实现这一点,但无论如何。

通过浏览官方文档进行逻辑复制,我找不到一些问题的答案:

  • 在对Db1进行新写入的场景中,Db2和Db3在同步到更改时都会锁定吗?还是允许在同步的同时进行读取?

  • 如果在发布对Db1的新更改时,订阅服务器正在执行读取,那么可用的更改是否会是到达订阅服务器后立即执行的下一个操作,而不管有多少读取已经在等待执行(如果有的话(?

我关心的是作为Db1副本的PostgreSQL服务器的负载平衡集群(仅用于读取(中的一致性。它们都应该与Db1同步,在同步到Db1发布的新更改之前,不允许对它们进行任何新的读取。如果我不能用逻辑复制做到这一点,那么有什么替代方案(如果有的话(?

在对Db1进行新写入的场景中,Db2和Db3在更新时都会锁定读取吗?

作者不会在宏观层面阻止读者。使用逻辑复制不会改变这一点。

即使在多核服务器上,在与Db1同步之前,是否会等待完成当前读取?

从某种意义上说。如果读取器锁定了某个页面进行读取,则写入者将无法写入该页面。然而,这种锁通常保持极短(亚微米(。

如果有等待,无论该服务器的操作队列中已经有多少读取,同步是否会是下一个要执行的操作?

什么是"操作队列"?我不相信PostgreSQL有。

它们都应该同步,在同步到Db1的新更改之前,不允许对它们进行任何新的读取。

即使所有查询都在同一台服务器上完成,您也无法控制只读查询是在提交其他查询前一纳秒执行,还是在提交后一纳秒执行。即使具有可串行化的隔离级别,也只能保证存在一些事务的串行顺序。您没有被告知该顺序是什么,也不允许查看clock_timestamp((之类的东西来弄清楚它。如果一个"只读"查询需要确保某个东西静止不动,它需要锁定它

如果只读事务使用其数据视图来做出决策,那么该决策需要反映回数据库中,这意味着该事务实际上不是只读的。

如果我不能用逻辑复制做到这一点,那么有什么替代方案(如果有的话(?

想要与众不同的东西。即使在同一台服务器内,也不能执行此操作。

最新更新