小编Iva*_*kov的帖子

Postgres:锁释放后 SELECT FOR UPDATE 看不到新行

尝试在我的应用程序中支持 PostgreSQL DB,发现了这种奇怪的行为。

准备:

CREATE TABLE test(id INTEGER, flag BOOLEAN);
INSERT INTO test(id, flag) VALUES (1, true);
Run Code Online (Sandbox Code Playgroud)

假设有两个并发事务 ( Autocommit=false, READ_COMMITTED ) TX1TX2

TX1:

UPDATE test SET flag = FALSE WHERE id = 1;
INSERT INTO test(id, flag) VALUES (2, TRUE);
-- (wait, no COMMIT yet)
Run Code Online (Sandbox Code Playgroud)

TX2:

SELECT id FROM test WHERE flag=true FOR UPDATE;
-- waits for TX1 to release lock
Run Code Online (Sandbox Code Playgroud)

现在,如果我在TX1中COMMIT,则 TX2 中的 SELECT 将返回空光标。

这对我来说很奇怪,因为 Oracle 和 MariaDB 中的相同实验导致选择新创建的行 (id=2)。

我在 …

postgresql locking transactions postgresql-11 select-for-update

8
推荐指数
1
解决办法
2471
查看次数