【发布时间】:2021-10-10 11:21:49
【问题描述】:
我目前正在写一篇关于不同事务隔离级别的文章,想展示脏读/不可重复读/幻读。
由于 PostgreSQL 没有 READ_UNCOMMITTED,因此无法显示脏读,我确实有一个不可重复读的示例。然而,我很难找到一个幻读的例子。
作为一个例子,我创建了这个:
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-Query 应该显示 Charlie,但事实并非如此。我认为只有 SERIALIZABLE 事务隔离级别才会出现这种情况。 REPEATABLE READ 是否也能防止 PostgreSQL 中的幻读?
【问题讨论】:
标签: sql postgresql transaction-isolation