首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可重复读取中的不一致性

可重复读取中的不一致性
EN

Database Administration用户
提问于 2013-05-15 16:11:48
回答 2查看 1.3K关注 0票数 13

http://www.postgresql.org/docs/9.2/static/transaction-iso.html

可重复读取模式提供了严格的保证,使每个事务都能看到数据库的一个完全稳定的视图。但是,此视图并不一定总是与同一级别并发事务的某些串行(一次一个)执行一致。例如,即使是此级别的只读事务也可能会看到更新的控制记录,以显示批处理已经完成,但没有看到逻辑上属于批处理的详细记录之一,因为它读取了控制记录的早期修订。试图通过在此隔离级别运行的事务强制执行业务规则,如果不仔细使用显式锁阻止冲突的事务,就不可能正确工作。

那不是幻影读取吗,在可重复读取模式下是不可能的?

文档指出,可重复读取事务中的查询在事务开始时会看到快照,那么查询怎么可能读取不一致的数据?

EN

回答 2

Database Administration用户

发布于 2013-06-06 06:27:02

这是我对那一节的解读。我承认这令人困惑。

假设我有两张桌子:

代码语言:javascript
复制
CREATE TABLE batch (
   id serial not null unique,
   control_code text primary key,
   date_posted date not null default now()
);

CREATE TABLE details (
   batch_id int not null references batch(id),
   description text,
   primary key(batch_id, description)
);

现在,假设我们在不同的事务中插入批处理和详细记录。会话1插入批处理并开始插入详细信息,但在完成之前,会话2将启动。会话2可以查看批处理标题信息,但不会等待提交详细信息来通知用户没有找到任何记录。现在,如果您的批处理和详细信息完全在同一个事务中,那么这绝不是一个问题。

这与可串行化不同,在确定是否通知用户没有找到行之前,您需要等待上一次插入完成并提交或回滚。

票数 7
EN

Database Administration用户

发布于 2013-05-15 16:52:26

幻影读取(确保不要混淆这与不可重复的读取)在“可重复读取”隔离级别是可能的.原则上。但是,如果选择“可重复读取”,Postgresql事实上的行为要比标准强(几乎是“可序列化的”隔离),因此,实际上您不会有幻影读取。文档

当您选择未提交的读级别时,就会真正得到Read提交,并且在Repeatable的PostgreSQL实现中,幻影读取是不可能的,因此实际的隔离级别可能比您选择的更严格。

现在,请注意“此视图不一定总是与同一级别并发事务的串行(一次一次)执行相一致”。我认为(我不确定)这意味着快照“来自外部”(固定在事务开始时)最终可以包括来自其他事务的行,但不能包含来自同一事务的其他行。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/43949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档