我目前正在写一篇关于不同事务隔离级别的文章,希望展示脏读/不可重复读/幻影读。
脏读是不可能显示的,因为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查询应该显示Charlie,但它没有,我认为只有SERIALIZABLE事务隔离级别才会出现这种情况。REPEATABLE READ是否也阻止了PostgreSQL中的幻影读取?
发布于 2021-10-10 12:52:49
在Postgres12中,REPEATABLE_READ事务隔离级别防止了幻象读取(source)。
https://stackoverflow.com/questions/69514697
复制相似问题