ali*_*ice 12 postgresql concurrency
http://www.postgresql.org/docs/9.2/static/transaction-iso.html
可重复读取模式提供了严格的保证,每个事务都可以看到完全稳定的数据库视图。但是,此视图不一定总是与同一级别的并发事务的某些串行(一次一个)执行一致。例如,即使是此级别的只读事务也可能会看到更新的控制记录以显示批次已完成,但看不到逻辑上属于批次的详细记录之一,因为它读取了控制记录的较早版本. 如果不小心使用显式锁来阻止冲突的事务,那么尝试通过在此隔离级别运行的事务来强制执行业务规则是不可能正常工作的。
这不是幻读,在可重复读取模式下是不可能的吗?
文档说可重复读取事务中的查询看到事务开始时的快照,那么查询怎么可能读取不一致的数据?
这是我对该部分的阅读。我承认这很令人困惑。
假设我有两个表:
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)
);
Run Code Online (Sandbox Code Playgroud)
现在,假设我们在不同的事务中插入批处理和详细记录。会话 1 插入一个批次并开始插入详细信息,但在它完成之前,会话 2 启动。会话 2 可以查看批处理标题信息,但不会等待提交详细信息以通知用户未找到任何记录。现在,如果您的批次和详细信息完全在同一笔交易中,那么这永远不是问题。
这与在确定是否通知用户未找到行之前等待前一个插入完成并提交或回滚的可序列化不同。
小智 1
原则上,幻读(请确保不要将其与不可重复读混淆)在“可重复读”隔离级别中是可能的。但是,当您选择“可重复读取”时,Postgresql 事实上的行为比标准更强(几乎是“可序列化”隔离),因此,事实上您不会出现幻读。文件:
当您选择“未提交读”级别时,您实际上会获得“已提交读”,并且在可重复读的 PostgreSQL 实现中不可能出现幻读,因此实际隔离级别可能比您选择的更严格。
现在,“此视图不一定始终与同一级别的并发事务的某些串行(一次一个)执行一致”怎么样?我认为(我不确定)这意味着“从外部”的快照(在事务开始时固定)最终可以包含来自其他事务的行,但无法包含来自同一事务的一些其他行。
归档时间: |
|
查看次数: |
1120 次 |
最近记录: |