当前位置: 首页 > news >正文

PostgreSQL报错“maximum number of prepared transactions reached”原因及高效解决方案解析

PostgreSQL 报错:maximum number of prepared transactions reached 解决方案

在使用 PostgreSQL 数据库时,可能会遇到如下报错:

ERROR: maximum number of prepared transactions reached
HINT: Increase max_prepared_transactions (currently 10).

这通常发生在使用 分布式事务(Two-Phase Commit, 2PC) 的场景中,例如:

  • 使用中间件(如 Atomikos、Narayana、ShardingSphere)进行分布式事务控制
  • 使用 XA 数据源(如 PostgreSQL + MyBatis + JTA)
  • 使用 PostgreSQL 作为分布式数据库(如 Postgres-XC、Citus)

一、问题原因分析

PostgreSQL 中的参数 max_prepared_transactions 用于控制允许同时存在多少个 已准备但尚未提交或回滚的事务

当你使用 PREPARE TRANSACTION 时,事务将被标记为“已准备”,此时还未完成最终提交或回滚。如果没有及时处理这些事务,就会导致积压,从而超出默认限制(默认值为 10)。

查看当前参数值

SHOW max_prepared_transactions;

默认返回:
max_prepared_transactions

10

二、解决方案

1. 临时解决:清理已准备事务

查看当前所有已准备的事务:

SELECT * FROM pg_prepared_xacts;

手动提交或回滚这些事务:

COMMIT PREPARED 'transaction_id';
-- 或
ROLLBACK PREPARED 'transaction_id';

注意transaction_idpg_prepared_xacts 表中 transaction 字段的值。你需要根据实际情况选择是执行 COMMIT PREPARED 还是 ROLLBACK PREPARED


2. 永久解决:调整 PostgreSQL 配置参数

2.1 修改配置文件 postgresql.conf

打开 PostgreSQL 安装目录下的 postgresql.conf 文件,找到并修改以下参数:

max_prepared_transactions = 100

⚠️ 建议max_prepared_transactions 应设置为大于等于 max_connections 的值,避免在高并发场景下由于预备事务数达到上限而触发错误。

如果你不清楚配置文件位置,可以使用如下 SQL 语句查询:

SHOW config_file;
2.2 重启 PostgreSQL 使配置生效

修改完 postgresql.conf 配置文件后,需重启数据库服务使参数生效。

以 Linux 系统为例:

# 使用 systemd 管理的系统(如 CentOS 7+, Ubuntu 16+)
sudo systemctl restart postgresql# 如果使用的是 service 命令管理 PostgreSQL
sudo service postgresql restart

验证参数是否已生效:

SHOW max_prepared_transactions;

三、其他注意事项

  • 避免长时间不提交的 Prepared 事务
    在使用 PREPARE TRANSACTION 后,如果未及时提交(COMMIT PREPARED)或回滚(ROLLBACK PREPARED),这些事务将持续占用资源,如内存、WAL 日志等。应确保业务流程完整,及时处理每一个预备事务。

  • 定期监控 pg_prepared_xacts
    建议通过定时脚本或接入数据库监控系统(如 Prometheus + PostgreSQL Exporter),周期性地检查 pg_prepared_xacts 视图,发现长期未处理的事务并进行干预处理。

  • 数据库异常重启风险
    如果数据库在存在 Prepared 状态事务时发生宕机,重启过程中可能导致数据库启动缓慢或事务阻塞,甚至出现数据一致性风险。因此应设置好告警与超时控制,避免长期存在未提交事务。


四、Postgres-XC / 分布式集群补充说明

如果你使用的是 Postgres-XC、Postgres-XL、Citus 等分布式 PostgreSQL 集群,以下是额外注意事项:

所有节点需同步配置

涉及节点包括:

  • Coordinator 节点(协调节点)
  • Datanode 节点(数据节点)

应在所有节点的 postgresql.conf 配置文件中设置:

max_prepared_transactions = 100

然后分别重启每个节点:

sudo systemctl restart postgresql

五、总结

报错信息原因解决方案
maximum number of prepared transactions reached分布式事务或 XA 操作未及时提交,导致 pg_prepared_xacts 中积压事务数超过默认限制(默认 10)1. 查看并清理 pg_prepared_xacts 中的事务
2. 提高 max_prepared_transactions 参数并重启数据库
3. 检查并优化业务逻辑,确保事务及时结束

六、参考资料

  • 🔗 PostgreSQL 官方文档 - PREPARE TRANSACTION
  • 🔗 PostgreSQL 官方文档 - pg_prepared_xacts 视图

如果你也在生产环境中使用 PostgreSQL 并启用了分布式事务机制,建议:

  • 合理调整参数:根据并发需求设置合适的 max_prepared_transactions
  • 加强监控:实时掌握预备事务积压情况;
  • 完善业务逻辑:避免因代码缺陷导致事务长时间未提交。

欢迎留言交流你的经验和解决方案,一起优化 PostgreSQL 的使用效果!🚀

如果你觉得这篇文章对你有所帮助,欢迎点赞 👍、收藏 ⭐、关注我获取更多实战经验分享!
如需交流具体项目实践,也欢迎留言评论!

http://www.dtcms.com/a/318396.html

相关文章:

  • 百货零售行业数字化蓝图整体规划方案(165页PPT)满分可编辑PPT
  • 构建语义搜索引擎:Weaviate的实践与探索
  • XXL-JOB快速入门
  • cygwin+php教程(swoole扩展+redis扩展)
  • 【完整源码+数据集+部署教程】爬行动物异常检测系统源码和数据集:改进yolo11-GhostDynamicConv
  • 一个php 连sqlserver 目标计算机积极拒绝,无法连接问题的解决
  • 第三节 YOLOv5数据集构成
  • 集成显卡 vs 独立显卡:如何通过设备管理器识别你的GPU?
  • Docker 常用命令介绍
  • 【docker】完整 Dockerfile 示例和构建运行指南
  • 飞浆 paddleocr 识别图片上文字的角度
  • 学习 Android(十四)NDK基础
  • OpenWebUI通过pipeline对接dify的workflow
  • 滑动窗口相关题目
  • VirtualBox 搭建 Linux 虚拟机全流程:Nginx 学习环境前置配置指南
  • ##Anolis OS 8.10 安装oracle19c
  • 广州汽车配件3d打印模型加工厂家-中科米堆CASAIM
  • 【计组】存储系统
  • 3479. 水果成篮 III
  • Tiny-cuda-nn安装指南
  • CVE-2021-1879
  • Linux系统编程——环境变量、命令行参数
  • Dart语言语法与技术重点
  • 数据结构—队列和栈
  • openGauss单实例安装
  • YOLOv11改进:集成FocusedLinearAttention与C2PSA注意力机制实现性能提升
  • Redis使用的常见问题及初步认识
  • PLC学习之路-数据类型与地址表示-(二)
  • WinXP配置一键还原的方法
  • 【golang面试题】Golang递归函数完全指南:从入门到性能优化