代码之家  ›  专栏  ›  技术社区  ›  Martin Thoma

我如何在博士后中强制实施幻觉阅读?

  •  0
  • Martin Thoma  · 技术社区  · 3 年前

    我目前正在写一篇关于不同事务隔离级别的文章,希望展示脏读/不可重复读/幻象读。

    脏读是不可能显示的,因为PostgreSQL没有未提交的读取,我有一个不可重复读取的示例。然而,我很难找到一个幻象阅读的例子。

    例如,我创建了以下内容:

    CREATE TABLE balances (id varchar PRIMARY KEY, balance int);
    INSERT INTO balances (id, balance) VALUES ('Alice', 40), ('Bob', 50);
    

    然后我有两个终端(T1和T2),通过它们我可以连接到数据库:

    T1$ start transaction isolation level repeatable read;
    T1$ SELECT * FROM balances WHERE balance > 10;
        id    | balance 
    ----------+---------
     Alice    |     40
     Bob      |     50
    
    T2$ INSERT INTO balances (id, balance) VALUES ('Charlie', 60);
    T1$ SELECT * FROM balances WHERE balance > 10;
    
        id    | balance 
    ----------+---------
     Alice    |     40
     Bob      |     50   
    

    为什么这不会让人产生幻觉?我原以为最后一个T1查询应该显示Charlie,但事实并非如此。我原以为只有可序列化事务隔离级别才会出现这种情况。可重复读取是否也可以防止PostgreSQL中的幻象读取?

    0 回复  |  直到 3 年前
        1
  •  1
  •   Martin Thoma    3 年前

    在Postgres 12中,可重复读取事务隔离级别可防止幻象读取( source ).

    推荐文章