PostgreSQL 9.1中并发的值修改会影响单个选择吗?

9
考虑在PostgreSQL 9.1(或9.2)中执行以下查询:
SELECT * FROM foo WHERE bar = true

假设这是一个相对耗时的查询(例如需要一分钟)。
如果在查询开始时,有500万条记录满足bar = true的条件,并且在另一个事务中添加和删除了foo表中的行,并针对某些现有行更新了bar字段。这些操作会影响上述显示的选择查询结果吗?
我知道事务隔离和单个事务中不同语句之间的可见性,但那么在运行单个语句时呢?
2个回答

11

编号。
由于MVCC模型,仅在查询开始时可见的元组将用于单个SELECT。手册中有详细信息此处

读取已提交是PostgreSQL中的默认隔离级别。当事务使用此隔离级别时,一个 SELECT 查询(没有 FOR UPDATE/SHARE 子句)只会看到在查询开始前提交的数据;它既不会看到未提交的数据,也不会看到并发事务执行期间提交的更改。实际上,一个 SELECT 查询看到的是数据库在查询开始运行时的快照。但是,SELECT 确实看到了其自身事务中执行的先前更新的效果,即使它们尚未提交。还要注意,即使它们位于同一事务中,如果其他事务在执行第一个 SELECT 期间提交更改,则两个连续的 SELECT 命令可以看到不同的数据。

强调是我的。


5
查询结果将会是一个读取时一致的数据视图,即查询开始时数据的快照。在PostgreSQL中,多版本并发控制(MVCC)的文档详细解释了其实现方式(表中存在多个记录版本)。而在Oracle中,序列更改号(SCN)与修改数据的“before-images”一起使用。这里有一份旧文档:《PostgreSQL中的事务处理》,其中有关于“非覆盖式存储管理”的部分。但请先看一下MVCC的章节。
或者在PostgreSQL文档的MVCC介绍中阅读。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接