PostgreSQL中的INSERT和事务序列化

时间:2010-06-10 02:28:55

标签: postgresql transactions isolation-level

我有一个问题。事务隔离级别设置为可序列化。当一个用户打开一个事务并在“table1”中插入或更新数据然后另一个用户打开一个事务并尝试将数据插入同一个表时,第二个用户是否需要等待,直到第一个用户提交事务? / p>

2 个答案:

答案 0 :(得分:3)

一般来说,没有。第二个事务是仅插入,因此除非需要进行唯一索引检查或其他触发,否则可以无条件地插入数据。对于唯一索引(包括主键),如果两个事务都更新具有相同值的行,它将阻止,例如:

-- Session 1                           -- Session 2
CREATE TABLE t (x INT PRIMARY KEY);
BEGIN;
INSERT INTO t VALUES (1);
                                       BEGIN;
                                       INSERT INTO t VALUES (1);  -- blocks here
COMMIT;
                                       -- finally completes with duplicate key error

对于可能影响其他事务的插入的更新,情况不太明显。我知道PostgreSQL在这种情况下还不支持“真正的”可序列化。我不知道其他SQL系统对它的支持程度如何。

请参阅http://www.postgresql.org/docs/current/interactive/mvcc.html

答案 1 :(得分:0)

第二个用户将被阻止,直到第一个用户提交或回滚他/她的更改。