使用子事务

本页目录

TL;DR

如无必要,否则不要使用子事务。

什么是子事务?

子事务,也称为"嵌套事务",是指在已启动的事务范围内通过指令启动的事务 (来源:Wikipedia)。这一特性允许用户部分回滚事务,这在许多情况下很有帮助:如果发生错误,重新执行的步骤会减少。

SQL 标准定义了描述这种机制的两个基本指令:SAVEPOINT 和扩展的 ROLLBACK 语句 — ROLLBACK TO SAVEPOINT。PostgreSQL 实现了这些指令,但允许在语法上稍有不同,例如可以在 RELEASE 和 ROLLBACK 语句中省略 SAVEPOINT 关键字。

你可能已经在使用子事务,例如:

如何使用 (如果你真的想用)

语法:

一个示例:

Rolled-back subtransaction example

推荐

对于任何计划增长的 OLTP 类型负载 (如 Web 和移动应用),我唯一的实际建议是:

尽可能避免子事务

如果你不想有一天发生以下情况:

Performance drop for more than 64 subtransactions in a transaction

或者类似情况:

Performance drop of standby server with primary running a long transaction and many subtransactions

你可以在这篇文章中找到对子事务四大危险的详细分析:PostgreSQL Subtransactions Considered Harmful。

截至 2023 年 (PG16 版本),这些问题尚未解决,尽管一些优化工作正在进行中:

底线是

我见

在 17 版本中,已经针对 SLRU 的问题进行了极大优化,并且可以配置 SLRU 相关参数 — multixact_member_buffers、multixact_offset_buffers 和 subtransaction_buffers。

SLRU optimization

Performance

讨论与补充

在 GitHub 查看讨论

支持作者

感谢支持 PostgreSQL Howto 的长期维护。

微信赞赏码

读者交流群

二维码若已过期,可通过公众号 PostgreSQL 学徒或邮件联系。

PostgreSQL 学徒读者交流群二维码