gpt4 book ai didi

database - PostgreSQL's Repeatable Read Allows Phantom Reads 但是它的文档说不允许

转载 作者:行者123 更新时间:2023-11-29 11:48:56 25 4
gpt4 key购买 nike

我对 Postgresql 可重复读取隔离级别有疑问。当幻读发生时,我确实做了一个关于可重复读隔离级别行为的实验。

Postgresql 的 manual says “该表还显示 PostgreSQL 的可重复读取实现不允许幻读。”

但是出现了幻读;

CREATE TABLE public.testmodel
(
id bigint NOT NULL
);

--第一节--

BEGIN TRANSACTION ISOLATION LEVEL Repeatable Read;
INSERT INTO TestModel(ID)
VALUES (10);

Select sum(ID)
From TestModel
where ID between 1 and 100;

--COMMIT;

--第2节--

BEGIN TRANSACTION ISOLATION LEVEL Repeatable Read;    
INSERT INTO TestModel(ID)
VALUES (10);

Select sum(ID)
From TestModel
where ID between 1 and 100;

COMMIT;

我遵循的步骤;

  1. 创建表
  2. 运行 session 1(我注释了提交语句)
  3. 运行 session 2
  4. 在 session 1 中运行提交语句。

令我惊讶的是,它们( session 1、 session 2)都没有任何异常地工作。

据我从文档中了解到。不应该的。在 session 2 之后提交时,我期待 session 1 抛出异常。

这是什么原因呢?我很困惑。

最佳答案

docs您提到将“幻读”定义为以下情况:

A transaction re-executes a query returning a set of rows that satisfy a search condition and finds that the set of rows satisfying the condition has changed due to another recently-committed transaction.

换句话说,如果您两次运行相同的查询(或两次寻求相同数据的查询)并且您得到不同的结果,就会发生幻读。 REPEATABLE READ 隔离级别可防止这种情况发生,即如果您重复相同的阅读,您将得到相同的答案。它不保证这些结果中的任何一个都反射(reflect)了数据库的当前状态。

由于您在每个事务中只读取一次数据,因此这不可能是幻读的示例。它属于更一般的“序列化异常”类别,即如果事务按顺序执行则不会发生的行为。只有在 SERIALIZABLE 隔离级别才能避免这种类型的异常。

Postgres wiki 上有一组优秀示例,描述了在REPEATABLE READ 下允许的异常,但在SERIALIZABLE 隔离下被阻止: https://wiki.postgresql.org/wiki/SSI

关于database - PostgreSQL's Repeatable Read Allows Phantom Reads 但是它的文档说不允许,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55516644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com