我目前正在写一篇关于不同事务隔离级别的文章,希望展示脏读/不可重复读/幻象读。
脏读是不可能显示的,因为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中的幻象读取?