子事务是在事务内部启动的,允许将大型事务分解成更小的单元。子事务可以提交或中止,而不会影响其父事务,允许父事务继续执行。这使得错误处理更容易,这是一种常见的应用程序开发模式。子事务通常简称为subxact。
子事务可以使用 SAVEPOINT
命令显式启动,但也可能以其他方式启动,例如 PL/pgSQL 的 EXCEPTION
子句。PL/Python 和 PL/Tcl 也支持显式子事务。子事务也可以从其他子事务中启动。顶层事务及其子事务形成了一个层次结构或树,这就是我们称主事务为顶层事务的原因。
如果为子事务分配了非虚拟事务 ID,则其事务 ID 被称为“subxid”。只读子事务不会分配 subxid,但一旦尝试写入,就会分配一个。这也导致 subxid 的所有父级(包括顶层事务)都被分配了非虚拟事务 id。我们确保父级 xid 始终低于其任何子级 subxid。
每个 subxid 的直接父级 xid 都记录在 pg_subtrans
目录中。顶层 xid 没有父级,因此不会创建条目,只读子事务也不会创建条目。
当子事务提交时,其所有已提交的带有 subxid 的子事务也将被认为在该事务中已子提交。当子事务中止时,其所有子事务也将被认为已中止。
当带有 xid 的顶层事务提交时,其所有已子提交的子事务也会在 pg_xact
子目录中持久记录为已提交。如果顶层事务中止,则其所有子事务也都会中止,即使它们已子提交。
每个事务保持打开的子事务越多(没有回滚或释放),事务管理开销就越大。每个后端最多可以缓存 64 个打开的 subxid;超过此限制后,由于在 pg_subtrans
中额外查找 subxid 条目,存储 I/O 开销会大幅增加。
如果您在文档中发现任何错误,与您对特定功能的体验不符,或者需要进一步说明,请使用 此表格 报告文档问题。