【发布时间】:2010-06-10 02:28:55
【问题描述】:
我有一个问题。事务隔离级别设置为可序列化。当一个用户打开一个事务并在“table1”中插入或更新数据,然后另一个用户打开一个事务并尝试将数据插入同一个表时,第二个用户是否需要等待直到第一个用户提交事务?
【问题讨论】:
标签: postgresql transactions isolation-level
我有一个问题。事务隔离级别设置为可序列化。当一个用户打开一个事务并在“table1”中插入或更新数据,然后另一个用户打开一个事务并尝试将数据插入同一个表时,第二个用户是否需要等待直到第一个用户提交事务?
【问题讨论】:
标签: postgresql transactions isolation-level
一般来说,不会。第二个事务只是插入,因此除非需要进行唯一索引检查或其他触发器,否则可以无条件插入数据。在唯一索引(包括主键)的情况下,如果两个事务都在更新具有相同值的行,它将阻塞,例如:
-- 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
【讨论】:
第二个用户将被阻止,直到第一个用户提交或回滚他/她的更改。
【讨论】: