PostgreSQL 自动增量是否可能出现竞争条件
Are race conditions possible with PostgreSQL auto-increment
在 table 中使用典型的自动递增字段创建的记录是否可以乱序读取?
例如,当值 9 的记录对 select 查询尚不可见时,值 10 的记录是否会出现在 select 查询的结果中?
我的问题的目的是......我想知道使用从一个查询中检索到的最大值作为下限来识别以后查询中以前未检索到的值是否可靠,或者可能会错过一行?
如果这种竞争条件在某些情况下是可能的,那么是否有任何可用于 select 查询的隔离级别不受该问题的影响?
是的,你能想到这件事真好。
你可以用三个并发的 psql 会话简单地证明这一点,给定一些 table
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
检测不存在相互依赖关系。
这就是添加逻辑解码的部分原因,因此您可以获得按提交顺序一致的流。
在 table 中使用典型的自动递增字段创建的记录是否可以乱序读取?
例如,当值 9 的记录对 select 查询尚不可见时,值 10 的记录是否会出现在 select 查询的结果中?
我的问题的目的是......我想知道使用从一个查询中检索到的最大值作为下限来识别以后查询中以前未检索到的值是否可靠,或者可能会错过一行?
如果这种竞争条件在某些情况下是可能的,那么是否有任何可用于 select 查询的隔离级别不受该问题的影响?
是的,你能想到这件事真好。
你可以用三个并发的 psql 会话简单地证明这一点,给定一些 table
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
检测不存在相互依赖关系。
这就是添加逻辑解码的部分原因,因此您可以获得按提交顺序一致的流。