PostgreSQL自增序列是否可能存在竞争条件?

7

在使用典型的自增字段创建表中记录时,是否存在任何条件使得这些记录可以按顺序以外的顺序进行读取?

例如,在记录值为9尚未对select查询可见时,值为10的记录是否可能出现在查询结果中?

我提出这个问题的目的是...我想知道是否可靠地使用从一个查询检索到的最大值作为较晚的查询中未检索到的值的下限,或者这可能会漏掉一行记录?

如果在某些情况下可能存在这种竞态条件,那么用于select查询的任何隔离级别是否都不受该问题的影响?

1个回答

6

是的,你能想到这点很不错。

如果有一个表,你可以使用三个并发psql会话轻松演示这一点。

CREATE TABLE x (
   seq serial primary key,
   n integer not null
);

那么

SESSION 1                    SESSION 2                       SESSION 3
BEGIN;     
                             BEGIN;
INSERT INTO x(n) VALUES(1)  
                             INSERT INTO x(n) VALUES (2);
                             COMMIT;
                                                             SELECT * FROM x;
COMMIT;
                                                             SELECT * FROM x;

不能假设对于任何生成的值n,所有已提交或已中止的事务都使用了所有生成的值n-1。它们可能正在进行中,并在您看到n后提交。

我认为隔离级别在这里并没有真正帮助你。 SERIALIZABLE没有互相依赖关系需要检测。

这就是为什么增加逻辑解码器的部分原因,因此您可以按提交顺序获取一致的流。


有没有其他方法可以避免这种非顺序读取的情况? - Ivan Vinogradov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接