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
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)用于可重复读隔离级别下的序列化事务,当事务持有过多谓词锁时,共享内存耗尽,导致错误。
官方文档
https://www.postgresql.org/docs/current/runtime-config-locks.html解决方案
-
编辑 postgresql.conf,增加 max_pred_locks_per_transaction 值(例如从 64 增加到 128 或 256),然后重启 PostgreSQL 服务。
-
降低事务隔离级别为 READ COMMITTED,避免使用谓词锁定:SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
无效尝试
常见但无效的做法:
-
75% 失败
增加 max_locks_per_transaction 而不是 max_pred_locks_per_transaction,不解决谓词锁问题。
-
80% 失败
重启 PostgreSQL 而不调整配置,临时释放内存但问题会重复出现。