选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

文档 / 配置参数 / 锁管理

CONFIGURATION PARAMETER锁管理

max_pred_locks_per_transaction

设置每个事务的谓词锁最大数量。

Sets the maximum number of predicate locks per transaction.

整数 重启生效 引入 9.1 现存至 20 devel 0 次默认值变更

类型
整数integer
上下文
重启生效只能在服务器启动时设置,修改后需要重启
默认值
64
取值范围
10 – 2147483647
分类
锁管理
引入版本
9.1
状态
现存

PostgreSQL 18 手册 官方文档 引入提交 6a77e9385e

版本轨迹

相对 PostgreSQL 17 无变化。

默认值变迁

64 9.1 – 20

默认值自 PostgreSQL 9.1 起没有变过。带单位的取值换算成了可读形式,原始的 boot_val 与单位写在悬浮提示里。

手册说明

PostgreSQL 18 手册 · 19.12 锁管理 本站手册 官方原文

共享谓词锁表跟踪在max_pred_locks_per_transaction * (max_connections + max_prepared_transactions) 个对象(如表)上的锁。因此,在任何一个时刻,只有不超过这么多个可区分对象能够被锁住。这个参数控制为每个事务分配的对象锁的平均数量。个体事务可以锁住更多对象,数量可以和锁表中能容纳的所有事务的锁一样多。这是能被锁住的行数,那个值是没有限制的。默认值 64 已经在测试中被证明通常是足够的,但是如果你有需要在一个可串行化事务中使用很多不同表的查询(例如查询一个有很多子表的父表),你可能需要提高这个值。这个参数只能在服务器启动时设置。

机制详解

设置每个事务的谓词锁最大数量。该值在服务器启动时固定,修改后必须重启。

它按每个后端或预备事务为 SERIALIZABLE 冲突跟踪规划共享谓词锁表。这是平均共享内存额度,不是单事务硬上限,也与普通行锁数量无关。

应把 max_pred_locks_per_transaction 与 deadlock_timeout、log_lock_waits、lock_timeout 一起监控和变更。先在对应角色与真实负载上验证,再按其 postmaster context 选择会话修改、reload 或 restart;历史默认值并不等于当前有效值。

调优建议

按典型负载给出的取值思路,不是放之四海皆准的配方:实际取值要看数据量、并发度与硬件。

  • OLTP在线事务处理

    从锁等待日志、涉及对象数量和并发上界校准 max_pred_locks_per_transaction;先修复过长事务与访问顺序,再增加共享内存或改变检测粒度。

  • OLAP分析与批处理

    分区查询、批量 DDL 与 SERIALIZABLE 报表可能触及大量对象;用最坏计划验证,而不是只看平均事务。

  • 小规格低配实例与开发机

    保持默认通常足够。若提高启动时锁表参数,要同时核算 max_connections、prepared transactions 与备库一致性。

常见问题

  • 把平均共享内存规划值当成单事务硬上限。
  • 提高参数却不核算连接数与预备事务带来的乘数。
  • 只扩容锁表,不修复长事务、对象访问顺序或分区爆炸。
  • 忽略备库必须具备兼容的启动时锁容量。

演化历史

相邻两个大版本之间的差异,新的在前。版本号链到该版的快照。

  1. PostgreSQL 20 ← 19 沿用 19

    事实沿用 19

  2. PostgreSQL 17 ← 16 仅描述更新

    补充说明 The shared predicate lock table is sized on the assumption that at most max_pred_locks_per_transaction objects per server process or prepared transaction will need to be locked at any one time. The shared predicate lock table is sized on the assumption that at most "max_pred_locks_per_transaction" objects per server process or prepared transaction will need to be locked at any one time.

  3. PostgreSQL 16 ← 15 仅描述更新

    补充说明 The shared predicate lock table is sized on the assumption that at most max_pred_locks_per_transaction * max_connections distinct objects will need to be locked at any one time. The shared predicate lock table is sized on the assumption that at most max_pred_locks_per_transaction objects per server process or prepared transaction will need to be locked at any one time.

  4. PostgreSQL 9.1 ← 9.0 新增此参数

    PostgreSQL 9.1 起可用

逐版本快照

每个收录版本里的 7 项事实,与上一个存在的版本不同的格子带底色。版本号链到该版。

版本 默认值单位上下文类型最小值最大值枚举值
9.1 64 重启生效 整数 10 2147483647
9.2 64 重启生效 整数 10 2147483647
9.3 64 重启生效 整数 10 2147483647
9.4 64 重启生效 整数 10 2147483647
9.5 64 重启生效 整数 10 2147483647
9.6 64 重启生效 整数 10 2147483647
10 64 重启生效 整数 10 2147483647
11 64 重启生效 整数 10 2147483647
12 64 重启生效 整数 10 2147483647
13 64 重启生效 整数 10 2147483647
14 64 重启生效 整数 10 2147483647
15 64 重启生效 整数 10 2147483647
16 64 重启生效 整数 10 2147483647
17 64 重启生效 整数 10 2147483647
18 64 重启生效 整数 10 2147483647
19 64 重启生效 整数 10 2147483647
20 沿用 64 重启生效 整数 10 2147483647

参考资料

同类参数

参数 类型 上下文 默认值 版本变动 最近变更
Lock Management 锁管理 5 个
deadlock_timeout 整数 会话(超级用户) 1 s 9.22 次
设置等待锁多久后开始检查死锁。 现存
max_locks_per_transaction 整数 重启生效 64 191 次
设置每个事务的锁数量上限。 现存
max_pred_locks_per_page 整数 重载生效 2
设置每页可保留的元组级谓词锁最大数量。 现存
max_pred_locks_per_relation 整数 重载生效 -2
设置每个关系可保留的页级和元组级谓词锁最大数量。 现存
max_pred_locks_per_transaction 整数 重启生效 64
设置每个事务的谓词锁最大数量。 现存