2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16
开发版本: devel

67.3. 子事务 #

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

子事务可以使用 SAVEPOINT 命令显式启动,但也可以通过其他方式启动,例如 PL/pgSQL 的 EXCEPTION 子句。PL/Python 和 PL/Tcl 也支持显式子事务。子事务也可以从其他子事务启动。顶级事务及其子事务形成一个层级或树,这就是为什么我们将主事务称为顶级事务。

如果子事务被分配了一个非虚拟事务 ID,它的事务 ID 就被称为 subxid。只读子事务不分配 subxids,但一旦它们尝试写入,就会被分配一个。这也会导致 subxid 的所有父事务,直到并包括顶级事务,都被分配非虚拟事务 ID。我们确保父 xid 始终低于其任何子 subxids。

每个 subxid 的直接父 xid 都记录在 pg_subtrans 目录中。顶级 xid 不会创建条目,因为它们没有父项,只读子事务也不会创建条目。

当子事务提交时,它所有已提交的、带有 subxids 的子事务也将在该事务中被视为已子提交。当子事务中止时,它所有子事务也将被视为中止。

当一个带有 xid 的顶级事务提交时,它所有已子提交的子事务也会在 pg_xact 子目录中持久记录为已提交。如果顶级事务中止,它的所有子事务也将被中止,即使它们已子提交。

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

提交更正

如果您在文档中发现任何不正确、与您对特定功能的体验不符或需要进一步说明的内容,请使用 此表单 报告文档问题。