PostgreSQL自动增量是否可以实现竞争条件

Ste*_*sen 6 postgresql auto-increment race-condition

是否存在使用典型自动增量字段在表中创建的记录可用于按顺序读取的条件?

例如,当值为9的记录对选择查询不可见时,值为10的记录是否会出现在选择查询的结果中?

我的问题的目的是......我想知道使用从一个查询中检索到的最大值作为下限来识别以后查询中先前未检索的值是否可靠,或者可能错过一行?

如果在某些情况下可能存在这种竞争条件,那么可以用于对该问题免疫的选择查询的任何隔离级别是什么?

Cra*_*ger 5

是的,对您的思考很​​有益。

您可以通过给出三个表的三个并发psql会话来简单地演示这一点

CREATE TABLE x (
   seq serial primary key,
   n integer not null
);
Run Code Online (Sandbox Code Playgroud)

然后

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;
Run Code Online (Sandbox Code Playgroud)

它是不是安全的假设,对于任何产生的价值n,所有产生的价值n-1已被用于已提交或已中止xacts。您看到之后,它们可能正在进行中并提交n

我认为隔离级别并没有真正帮助您。没有相互依赖的关系SERIALIZABLE可以检测。

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