插入和删除之间的奇怪事务交互

时间:2015-10-13 20:27:23

标签: postgresql

我有一张桌子

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,这仍然会发生。)

为什么会这样?

0 个答案:

没有答案