↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

不受支持的版本: 7.2 / 7.1
历史版本PostgreSQL 7.2 已于 2007 年 2 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本手册首页。

9.4. 可串行化隔离级别 #

可串行化提供最高的事务隔离。该级别模拟串行的事务执行,就好像事务是一个接一个串行执行的,而不是并发执行的。不过,使用这一级别的应用必须准备好在出现串行化失败时重试事务。

当事务使用可串行化级别时, SELECT 查询只能看到事务开始之前已经提交的数据,既看不到未提交的数据,也看不到事务执行期间并发事务提交的更改。(不过, SELECT 能看到同一事务中先前执行的更新效果,即使这些更新尚未提交。)这与读已提交的不同之处在于, SELECT 看到的是事务开始时刻的快照,而不是事务内当前查询开始时刻的快照。

如果查询在执行 UPDATE 语句(或 DELETE 或 SELECT FOR UPDATE)时找到的目标行,已经被一个并发未提交事务更新,那么试图更新该行的第二个事务会等待另一个事务提交或回滚。若对方回滚,等待的事务可以继续更改该行。若并发事务提交,可串行化事务将被回滚并收到以下消息:

ERROR:  Can't serialize access due to concurrent update

因为可串行化事务不能修改在它开始之后被其他事务更改过的行。

当应用收到这条错误消息时,应当中止当前事务,并从头重试整个事务。第二次执行时,该事务会把先前已提交的更改视为其初始数据库视图的一部分,因此以该行的新版本作为新事务更新的起点时,就不存在逻辑冲突。注意,只有更新型事务才可能需要重试——只读事务永远不会发生串行化冲突。

可串行化事务级别严格保证每个事务都看到完全一致的数据库视图。不过,当并发更新使得无法维持串行执行的假象时,应用必须准备好重试事务,而重做复杂事务的代价可能很高。因此,只有当更新查询包含的逻辑复杂到在读已提交级别下可能给出错误结果时,才推荐使用这一级别。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。