支持的版本:当前 (17) / 16
开发版本:devel

66.3. 子事务 #

子事务在事务内部启动,允许将大型事务分解为更小的单元。子事务可以提交或中止,而不会影响其父事务,从而允许父事务继续进行。这使得错误处理更容易,这是一种常见的应用程序开发模式。子事务通常缩写为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 开销会显著增加。

提交更正

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