【问题标题】:Are race conditions possible with PostgreSQL auto-incrementPostgreSQL自动增量是否可能出现竞争条件
【发布时间】:2017-10-25 17:36:26
【问题描述】:
在什么情况下,使用典型的自增字段在表中创建的记录可以被无序读取?
例如,当值 9 的记录对选择查询不可见时,值 10 的记录是否会出现在选择查询的结果中?
我的问题的目的是......我想知道使用从一个查询中检索到的最大值作为下限来识别以后查询中以前未检索到的值是否可靠,或者可能会错过一行?
如果这种竞争条件在某些情况下是可能的,那么可用于选择查询的任何隔离级别是否不受该问题的影响?
【问题讨论】:
标签:
postgresql
auto-increment
race-condition
【解决方案1】:
是的,很高兴你考虑到这一点。
你可以用三个并发的 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 都已被已提交或已中止的 xacts 使用。在您看到 n 之后,它们可能正在进行并提交。
我认为隔离级别在这里并不能真正帮助您。 SERIALIZABLE 没有相互依赖关系来检测。
这也是添加逻辑解码的部分原因,因此您可以按提交顺序获得一致的流。