考虑在 PostgreSQL 9.1(或 9.2)中执行的以下查询:
SELECT * FROM foo WHERE bar = true
假设这是一个相当长的运行查询(例如需要一分钟)。
如果在查询开始时有 500 万条记录bar = true
成立,并且在另一个事务中的查询期间,在foo
表,并对某些现有行进行更新bar
field.
这是否会影响上面显示的选择查询的结果?
我了解单个事务中不同语句之间的事务隔离和可见性,但是正在运行的单个语句又如何呢?
No.
由于 MVCC 模型,只有元组在querystart 将用于单个SELECT
。说明书中有详细说明here http://www.postgresql.org/docs/current/interactive/transaction-iso.html#XACT-READ-COMMITTED:
已提交读是 PostgreSQL 中的默认隔离级别。当一个
事务使用此隔离级别,一个 SELECT 查询(不带 FOR
UPDATE/SHARE 子句)只能看到查询开始之前提交的数据;它永远不会看到未提交的数据或在期间提交的更改
通过并发事务执行查询。实际上,一个 SELECT 查询
看到查询开始那一刻的数据库快照
跑步。但是,SELECT 确实会看到先前执行的更新的效果
在它自己的事务中,即使它们尚未提交。
另请注意,两个连续的 SELECT 命令可以看到不同的数据,
即使它们在单个事务中,如果其他
事务在执行第一个 SELECT 期间提交更改。
强调我的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)