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

67.3. 子事务 #

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

子事务可以使用SAVEPOINT命令显式启动,也可以通过其他方式启动,例如 PL/pgSQL 的EXCEPTION子句。PL/Python 和 PL/Tcl 也支持显式子事务。 子事务还可以在其他子事务内部启动。顶层事务及其子事务形成一个层级或树状结构,这就是我们把主事务称为顶层事务的原因。

如果某个子事务被赋予非虚拟事务 ID,则其事务 ID 被称为 subxid。只读子事务不会被赋予 subxid,但一旦尝试写入,就会被赋予一个。这也会导致该 subxid 的所有父事务,直至并包括顶层事务,都被赋予非虚拟事务 ID。我们确保父 xid 总是小于其任一子 subxid。

每个 subxid 的直接父 xid 都记录在pg_subtrans 目录中。顶层 xid 因为没有父事务而不会有记录,只读子事务也不会有记录。

当子事务提交时,它所有已提交且带有 subxid 的子事务在该事务中也会被视为处于 subcommitted 状态。当子事务中止时,它的所有子事务也都会被视为已中止。

当带有 xid 的顶层事务提交时,其所有处于 subcommitted 状态的子事务也会在pg_xact子目录中被持久地记录为已提交。如果顶层事务中止,则其所有子事务也都会中止,即使它们此前已经被视为处于 subcommitted 状态。

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

提交更正

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