【问题标题】:long running queries and new data长时间运行的查询和新数据
【发布时间】:2018-01-24 08:47:45
【问题描述】:

我正在研究一个 postgres 系统,它的表包含 10 或 100 的数百万行,并以每秒几行的速度输入。

我需要对这些表的行进行一些处理,因此我计划运行一些简单的选择查询:使用基于范围的 where 子句选择 *(每行包含一个时间戳,这就是我将使用的范围)。它可能是一个“封闭范围”,我知道表中包含开始和结束,并且我知道没有新数据会落入该范围,或者是一个开放范围:即范围边界之一可能不是“ in the table yet" 并且表中的行可能因此落在该范围内。

由于响应本身将包含数百万行,并且每行的处理可能需要一些时间(10 毫秒)我完全知道我将使用游标并一次获取几 1000 行.我的问题是:

如果我运行“开放范围”查询:我会只得到开始查询时的结果,还是会在我运行 fetch 时将新行插入到该范围内的表中?

(我倾向于认为不,我不会看到新行,但我想要确认...)

【问题讨论】:

  • 我试过玩 3 个事务,无论我何时插入行,如果游标事务较早开始,它都看不到新行 - 无论我何时获取或提交插入事务。但我相信它没有保险,因为它没有可序列化的级别就无法监控。但是您应该等待对您的问题的更多关注-我从未经历过并发事务,但是在子查询中-因此我不确定在获取时是否适用相同的规则
  • 感谢 Vao,这就是帮助指出的手册所说的内容:Read Committed 是 PostgreSQL 中的默认隔离级别。当事务使用此隔离级别时,SELECT 查询(没有 FOR UPDATE/SHARE 子句)只能看到在查询开始之前提交的数据。所以我想我有我的答案:)

标签: postgresql


【解决方案1】:

更新

在任何隔离级别下都不应该发生:

https://www.postgresql.org/docs/current/static/transaction-iso.html

但 Postgres 仅在 Serializable 隔离中保证它

【讨论】:

    【解决方案2】:

    好吧,我认为当您进行查询时,这意味着您创建了一个新事务,并且在提交之前它不会从任何其他事务接收/更新数据。

    所以,基本上“您只会得到开始查询时的结果”

    【讨论】:

      猜你喜欢
      • 2014-01-28
      • 1970-01-01
      • 1970-01-01
      • 2014-03-14
      • 2018-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多