【发布时间】:2019-07-03 00:51:25
【问题描述】:
尝试在我的应用程序中支持 PostgreSQL DB,发现这种奇怪的行为。
准备工作:
CREATE TABLE test(id INTEGER, flag BOOLEAN);
INSERT INTO test(id, flag) VALUES (1, true);
假设两个并发事务(Autocommit=false, READ_COMMITTED)TX1 和 TX2:
TX1:
UPDATE test SET flag = FALSE WHERE id = 1;
INSERT INTO test(id, flag) VALUES (2, TRUE);
-- (wait, no COMMIT yet)
TX2:
SELECT id FROM test WHERE flag=true FOR UPDATE;
-- waits for TX1 to release lock
现在,如果我在 TX1 中COMMIT,TX2 中的 SELECT 将返回空光标。
这对我来说很奇怪,因为 Oracle 和 MariaDB 中的相同实验导致选择新创建的行 (id=2)。
我在 PG 文档中找不到有关此行为的任何信息。 我错过了什么吗? 有什么办法可以强制 PG 服务器在获取锁后“刷新”语句可见性?
PS:PostgreSQL 版本 11.1
【问题讨论】:
标签: postgresql transactions locking postgresql-11 select-for-update