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

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

受支持版本: 当前版本 (18) / 17 / 16
测试与开发版本: 19 / devel
测试版PostgreSQL 19 RC 1 尚未正式发布,内容与行为在正式发布前可能变化。正式内容请看当前版本。

67.3. 子事务 #

子事务在事务内部启动,允许把大事务拆分为较小的单元。子事务可以提交或中止而不影响其父事务,从而使父事务可以继续执行。这使得错误更容易处理,这是应用开发中的常见模式。subtransaction 一词通常缩写为 subxact。

子事务可以使用 SAVEPOINT 命令显式启动,也可以通过其他方式启动,例如 PL/pgSQL 的 EXCEPTION 子句。PL/Python 和 PL/Tcl 也支持显式子事务。子事务还可以在其他子事务内部启动。顶层事务及其子事务形成一个层级或树状结构,这就是我们把主事务称为顶层事务的原因。

如果某个子事务被赋予非虚拟事务 ID,则其事务 ID 被称为“subxid”。只读子事务不会被赋予 subxid,但一旦尝试写入,就会被赋予一个。这也会导致该 subxid 的所有父事务,直至并包括顶层事务,都被赋予非虚拟事务 ID。我们确保父 xid 总是小于其任一子 subxid。

每个 subxid 的直接父 xid 都记录在 pg_subtrans 目录中。顶层 xid 因为没有父事务而不会有记录,只读子事务也不会有记录。

当子事务提交时,它所有已提交且带有 subxid 的子事务在该事务中也会被视为处于已子提交(subcommitted)状态。当子事务中止时,它的所有子事务也都会被视为已中止。

当带有 xid 的顶层事务提交时,其所有处于已子提交状态的子事务也会在 pg_xact 子目录中被持久地记录为已提交。如果顶层事务中止,则其所有子事务也都会中止,即使它们此前已经被视为处于已子提交状态。

每个事务保持打开状态(未回滚也未释放)的子事务越多,事务管理开销就越大。每个后端最多会在共享内存中缓存 64 个打开的 subxid;超过这一点之后,由于需要额外查找 pg_subtrans 中的 subxid 条目,存储 I/O 开销会显著增加。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游会在正式发布前持续修订。