Postgresql 中文操作指南
74.3. Subtransactions #
子事务在事务中启动,允许将大型事务分解成更小的单元。子事务可以提交或中止而不影响其父事务,从而允许父事务继续。这样可以更轻松地处理错误,这是常见应用程序开发模式。子事务一词通常缩写为 subxact。
可以使用 SAVEPOINT 命令显式启动子事务,但也可以通过其他方式启动,例如 PL/pgSQL 的 EXCEPTION 子句。PL/Python 和 PL/Tcl 也支持显式子事务。还可以从其他子事务启动子事务。顶级事务及其子事务形成一个层次结构或树,这就是我们称主要事务为顶级事务的原因。
如果向子事务分配了非虚拟事务 ID,则其事务 ID 被称为“subxid”。只读子事务不分配 subxid,但一旦它们尝试写入,就会分配一个 subxid。这也将导致 subxid 的所有父级(包括顶级事务)被分配非虚拟事务 id。我们确保父 xid 始终低于其任何子 subxid。
每个 subxid 的直接父 xid 都记录在 pg_subtrans 目录中。不会为顶级 xid 创建条目,因为它们没有父级,也不会为只读子事务创建条目。
当子事务提交时,其所有已提交的具有 subxid 的子子事务也将被认为已在此事务中提交。当一个子事务中止时,其所有子事务也将被视为已中止。
具有 xid 的顶级事务提交时,其所有已提交的子子事务也会在 pg_xact 子目录中被永久记录为已提交。如果顶级事务中止,则其所有子事务也会中止,即使它们已提交。
每个事务保持打开状态(未回滚或释放)的子事务越多,事务管理开销就越大。每个后端最多可以缓存 64 个开放的 subxid;在超出该点后,由于在 pg_subtrans 中额外查找 subxid 条目,存储 I/O 开销将显著增加。