我有一张桌子
CREATE TABLE table (
id SERIAL PRIMARY KEY
foo INT
)
我同时运行insert:
INSERT INTO table (foo) VALUES (?)
并删除
DELETE FROM table WHERE ctid = (
SELECT ctid FROM table -- <= call this query 'a'
WHERE foo = ?
ORDER BY id LIMIT 1)
RETURNING *
(即删除满足某些条件的id
最低的行)
当隔离级别设置为Serializable时,我偶尔会从删除中获取ERROR: could not serialize access due to read/write dependencies among transactions
。这非常有意义:如果插入在查询&#39; a&#39;之间提交。发生,当删除想要提交时,查询结果&#39; a&#39;不再一致。
没有意义的是较低隔离级别的行为。我期望发生的是查询&#39; a&#39;找到一些ctid
,插入提交,然后删除带有ctid
的行。但实际发生的是 no 行被删除;即使该行仍然存在,该语句也不返回任何内容。 (如果我使用id
而不是ctid
,这仍然会发生。)
为什么会这样?