pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
读已提交 是 Postgres 中的默认隔离级别。当事务使用这一隔离级别时, SELECT 查询只能看到查询开始之前已经提交的数据,既看不到未提交的数据,也看不到查询执行期间并发事务提交的更改。(不过, SELECT 能看到同一事务中先前执行的更新效果,即使这些更新尚未提交。)注意,如果其他事务在第一个 SELECT 执行期间提交了更改,即使两个连续的 SELECT 命令位于同一个事务中,它们也可能看到不同的数据。
如果查询在执行 UPDATE 语句(或 DELETE 或 SELECT FOR UPDATE)时找到的目标行,已经被一个并发未提交事务更新,那么试图更新该行的第二个事务会等待另一个事务提交或回滚。若对方回滚,等待的事务可以继续更改该行。若对方提交(且该行仍然存在,即没有被另一个事务删除),查询会针对该行重新执行,以检查新行版本是否仍然满足查询的搜索条件。如果新行版本满足查询搜索条件,该行将被更新(或删除或标记为更新)。注意,更新的起点将是新行版本;而且,更新之后这个被更新过两次的行对当前事务中后续的 SELECT 可见。因此,当前事务能够看到另一个事务对这一特定行的效果。
读已提交级别所提供的部分事务隔离对许多应用来说已经足够,而且这一级别快速又易于使用。不过,对于执行复杂查询和更新的应用,可能需要保证比读已提交级别更严格一致的数据库视图。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。