首页 > 解决方案 > ClientA 中写入事务的更改是否立即对 ClientB 读取可见,在 COMMIT 之后开始?

问题描述

我们正在观察我们的一些工作流程中的一些行为/错误,这些行为/错误与 Postgres 写入事务的一致性和可见性有关,然后是读取。我们的一位开发人员提供了解释,但我找不到任何记录所提议推理的搜索结果。

给定一个 Postgres 10.3 主机,会发生以下操作:

  1. ClientA 执行成功的写事务
  2. 在 COMMIT 之后,发出一个外部通知
  3. ClientB 对外部通知做出反应并执行读取,结果发现 UPDATE 事务更改不可见

提出的解释是,不同线程上的两个 postgres 客户端连接没有保证的视图快照,并且可能不会在提交后立即观察写入事务更新。但是从我所读的内容来看,我希望在 COMMIT 成功之后,读取操作然后开始响应应该会看到该写入的效果。

我的具体问题是:给定不同线程上的两个数据库客户端连接,一个客户端在另一个客户端提交后查看写入事务的效果是否可能出现竞争条件?(无重叠交易)。

到目前为止,我发现的每一点文档都只涉及对重叠/并发事务和 MVCC/事务隔离主题的关注。没有关于两个不同客户端连接之间的同步串行操作。

编辑:关于配置的一些额外细节。ClientA 和 ClientB 将是通过连接池访问 postgres 的不同线程。客户端可能都在同一个应用服务器的同一个连接池中,也可能是ClientA/ApplicationA和ClientB/ApplicationB。当 ClientB 做出反应时,它将访问现有的应用程序服务器连接池以进行新的读取。

标签: postgresql

解决方案


不,这不可能发生,除非读取事务更早开始并且在REPEATABLE READorSERIALIZABLE隔离级别上运行。

还有一种可能是读事务没有连接到与写事务相同的服务器,而是连接到hot_standby启用的流复制备用服务器。然后这很容易发生,即使使用同步复制(除非你设置synchronous_commit = remote_apply)。


推荐阅读