database resource_error ai_generated true

错误:共享内存不足 提示:您可能需要增加 max_pred_locks_per_transaction。

ERROR: out of shared memory HINT: You might need to increase max_pred_locks_per_transaction.

ID: database/postgresql-max-pred-locks-per-transaction

其他格式: JSON · Markdown 中文 · English
85%修复率
84%置信度
1证据数
2023-08-20首次发现

版本兼容性

版本状态引入弃用备注
PostgreSQL 13.10 active
PostgreSQL 14.7 active
PostgreSQL 15.3 active

根因分析

PostgreSQL 的谓词锁定(predicate locking)用于可重复读隔离级别下的序列化事务,当事务持有过多谓词锁时,共享内存耗尽,导致错误。

English

PostgreSQL 的谓词锁定(predicate locking)用于可重复读隔离级别下的序列化事务,当事务持有过多谓词锁时,共享内存耗尽,导致错误。

generic

官方文档

https://www.postgresql.org/docs/current/runtime-config-locks.html

解决方案

  1. 编辑 postgresql.conf,增加 max_pred_locks_per_transaction 值(例如从 64 增加到 128 或 256),然后重启 PostgreSQL 服务。
  2. 降低事务隔离级别为 READ COMMITTED,避免使用谓词锁定:SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

无效尝试

常见但无效的做法:

  1. 75% 失败

    增加 max_locks_per_transaction 而不是 max_pred_locks_per_transaction,不解决谓词锁问题。

  2. 80% 失败

    重启 PostgreSQL 而不调整配置,临时释放内存但问题会重复出现。