【问题标题】:INSERT and transaction serialization in PostreSQLPostgreSQL 中的 INSERT 和事务序列化
【发布时间】:2010-06-10 02:28:55
【问题描述】:

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

【问题讨论】:

    标签: postgresql transactions isolation-level


    【解决方案1】:

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

    -- 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

    【讨论】:

    • hm.. 所以如果我在这个表中有一个主键,将执行唯一索引检查并阻止第二个用户?
    • 根据我的经验,很多表都有唯一索引。
    • 第二个事务阻塞只是因为它试图插入一个重复的键。如果键没有冲突,就不会有阻塞。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-14
      • 2018-10-05
      • 1970-01-01
      • 2015-01-17
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      相关资源
      最近更新 更多