Redrock Postgres 搜索 英文
版本: 16 / 17

66.3. 子事务 #

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

可以用 SAVEPOINT 命令显式启动子事务,但也可以用其他方式启动,例如 PL/pgSQL 的 EXCEPTION 子句。PL/Python 和 PL/Tcl 也支持显式子事务。子事务也可以从其他子事务启动。顶级事务及其子子事务形成层次结构或树,这就是我们称主事务为顶级事务的原因。

如果给子事务分配一个非虚拟事务 ID,则其事务 ID 称为 子事务 ID。只读子事务不会分配子事务 ID,但一旦它们尝试写入,就会分配一个子事务 ID。这也导致子事务 ID 的所有父项(包括顶级事务在内)分配非虚拟事务 ID。我们确保父 XID 始终低于其任何子子事务 ID。

每个子事务 ID 的直接父 XID 记录在 pg_subtrans 目录中。顶级 XID 没有父项,所以没有创建条目,只读子事务也没有创建条目。

当子事务提交时,其所有已提交且带有子事务 ID 的子子事务也将被视为该事务中已提交。当子事务中止时,其所有子子事务也将被视为已中止。

当某个具有 xid 的顶级事务提交时,其所有已子提交的子事务也作为已提交的内容永久记录在 pg_xact 子目录中。如果顶级事务中止,其所有子事务也中止,即使子事务已子提交。

每个事务保留的子事务越多(未回滚或释放),事务管理开销越大。最多 64 个开放式子 xid 会缓存在每个后台的共享内存中;在这一点上,由于在 pg_subtrans 中对子 xid 条目进行其他查找,存储 I/O 开销大幅增加。