当前位置: 首页 > 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.lryc.cn/news/611620.html

相关文章:

  • 推荐一款优质的开源博客与内容管理系统
  • Mac安装WebStorm
  • C++11实现线程池(2)固定线程池
  • Java Stream API 详解(Java 8+)
  • 云计算一阶段Ⅱ——12. SELinux 加固 Linux 安全
  • 8.6学习总结
  • AI增强的软件测试工具
  • 网站、域名、IP在什么场景下需要备案
  • 动态代理常用的两种方式?
  • OA系统详解:有哪些功能、主流产品怎么选?
  • 自己本地搭建的服务器怎么接公网?公网IP直连服务器方法,和只有内网IP直接映射到互联网
  • 深度解析:AI如何重塑供应链?从被动响应到预测性防御的三大核心实践
  • 希尔排序:高效插入排序的进阶之道
  • 【JS-7-ajax】AJAX技术:现代Web开发的异步通信核心
  • 【Java String】类深度解析:从原理到高效使用技巧
  • 生成网站sitemap.xml地图教程
  • 从代码学习LLM - llama3 PyTorch版
  • GitHub Spark公共预览版上线
  • 利用OJ判题的多语言优雅解耦方法深入体会模板方法模式、策略模式、工厂模式的妙用
  • 本地服务器端部署基于大模型的通用OCR项目——dots.ocr
  • 达梦数据库日常运维命令
  • cdn是什么
  • 【C++】unordered系列容器使用及封装
  • 生成式 AI 重塑自动驾驶仿真:4D 场景生成技术的突破与实践
  • QT----不同线程中信号发送了槽函数没反应QObject::connect: Cannot queue arguments of typeXXX
  • SG105 Pro 网管交换机的3种VLAN配置
  • java实现生成自定义二维码
  • 软考信息安全工程师11月备考
  • Ragflow介绍与安装
  • 考研408_数据结构笔记(第四章 串)