【发布时间】: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