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

时间:2017-05-25 06:58:19

标签: postgresql auto-increment race-condition

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

例如,当选择查询尚未看到值为9的记录时,值为10的记录是否会出现在选择查询的结果中?

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

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

1 个答案:

答案 0 :(得分:5)

是的,并且善于考虑它。

在给定一些表

的情况下,您可以通过三个并发的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,已经提交或已经中止的xacts已使用所有生成的值n-1。在看到n后,它们可能正在进行中并提交。

我不认为隔离级别对你有帮助。 SERIALIZABLE无法相互依赖。

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