TGViewer
开发者工具箱|编程·开发工具·资源 开发者工具箱|编程·开发工具·资源 @devtoolboxhub · 780 subscribers
Post #1876 4
PostgreSQL 的 max_prepared_transactions 该不该开

prepared transaction 是脱离会话独立存在的两阶段提交事务。执行 PREPARE TRANSACTION 'some-gid' 后,原会话不再持有事务,但事务占用的锁和事务 ID 会写入 WAL、记录在共享内存中,崩溃恢复后依然存在,直到有人执行 COMMIT PREPARED 或 ROLLBACK PREPARED。max_prepared_transactions 控制服务器同时保留多少个这类事务,默认值为 0,上限 262143,属于 postmaster 级参数,开启和关闭都需要重启。

默认值并非一直是 0。8.3 及以前是 5,Tom Lane 在 8.4(2009)改为 0,原因是项目已多次遇到 prepared transaction 被遗忘、最终引发严重维护问题甚至 anti-wraparound 停机,而此前默认非零只是为了回归测试能覆盖该特性。同一提交还把 prepared transaction 写进了 wraparound 警告的 HINT,在 18 上依然保留。
在 18.6 上实测:准备一个更新了一行的事务后断开,新会话里 pg_stat_activity 看不到任何 backend,但 pg_locks 中仍有该表的 RowExclusiveLock、索引锁以及自身 XID 的 ExclusiveLock,pid 为空。对该表执行 ALTER TABLE ... ADD COLUMN 会一直等待直到 lock_timeout 取消;VACUUM (VERBOSE) 报告 500 个死元组不可回收,removable cutoff 等于该事务的 XID。它像普通 backend 一样占用 PGPROC 槽位,只是没有进程附着。
很多手段对它无效:idle_in_transaction_session_timeout 没有会话可超时;transaction_timeout(17 起)在 PREPARE 时停止计时;pg_terminate_backend() 没有对象可终止;以 -m immediate 重启后日志显示从共享内存恢复 prepared transaction 754;DROP DATABASE 和 pg_upgrade --check 都会拒绝。创建逻辑复制槽也会被它阻塞。唯一出口是 COMMIT PREPARED 或 ROLLBACK PREPARED,需连接同一数据库,且需超级用户或准备该事务的角色。

真正需要这个参数的只有三种场景:XA 事务管理器(如 JTA、Atomikos、Narayana)跨 PostgreSQL 与消息队列或第二个数据库协调提交;Citus 11 起对每个多分片写入在 worker 间做两阶段提交,官方建议在每个 worker 上调高;以及 two_phase = on(15 起)的逻辑复制订阅,订阅端需要准备发布端已准备的事务。除此之外,文档明确表示该命令是为事务管理器准备的,不写事务管理器就不该使用它。

若确需开启,建议设为 max_connections,理由是每个会话在管理器卡住时都可能有一个待决事务,而达到上限会在 prepare 阶段转为回滚,正是事务管理器要避免的失败。共享内存开销接近一个连接:18.6 上一千个槽位增加 47 MB,一千个连接增加 51 MB,一百个槽位约 4 MB。备库规则更关键:该参数与 max_connections、max_locks_per_transaction、max_wal_senders、max_worker_processes 同属备库不得小于主库的五个参数,否则备库无法启动或暂停恢复。调整顺序是先备库、后主库。开启前应把 pg_prepared_xacts 中 prepared 超过 5 分钟的记录纳入监控,真正的两阶段提交只停留毫秒级,超时未决的就是孤儿事务,正在占用锁和 vacuum 视野。
More from @devtoolboxhub
  1. Sep 25, 2026用 SLO 给 AI Agent 的行为定个预算 Grafana Labs 提出把可靠性工程里的错误预算(error budget)思路用到 AI Agent 上。延迟、token…
  2. Sep 25, 2026Xcode 27.2 改用 JSON 项目格式 Xcode 27.2 用基于 JSON 的 project.xcproj 取代了沿用多年的 project.pbxproj。新建项目…
  3. Sep 24, 2026RPI 实战:用 Claude Code 子代理拆分研发流程 一个约十几个产品的小团队(helpdesk、MES、邮件托管、高校 AI 助手)在 monorepo 里日常使用 Cl…
  4. Sep 24, 2026云原生架构下的依赖模拟工具问题 当前主流依赖模拟工具并非针对云原生架构设计。这些工具诞生于服务有固定发布周期、上游依赖变更缓慢且明确、测试团队可清晰掌握依赖行为的时代,而云原生架构…
  5. Sep 24, 2026DMAIC 框架如何优化技术交付 技术项目通常能清晰描述交付内容,但常常缺失对改善目标、问题证据、根因、成功基准和持续改进机制的梳理。DMAIC 是定义、测量、分析、改进、控制的缩…
  6. Sep 23, 20262026年五大热门MCP网关汇总 MCP标准化了模型和代理连接外部系统的方式,当组织内有大量AI应用、工具和多团队协作时,连接MCP服务不难,难在管理。 MCP网关就是用于解决这类…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →