↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

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–20 之间未变。带单位的取值换算成了可读形式,原始的 boot_val 与单位写在悬浮提示里。

手册说明

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

本版译文与 PostgreSQL 16 完全一致,下面就是同一段文字。

共享谓词锁表为每个服务器进程或预备事务预留可容纳max_pred_locks_per_transaction 个对象(例如表)的空间;因此,在任何时刻可被锁住的不同对象数都不能超过总容量。这个参数限制每个事务使用的对象锁的平均数量;只要所有事务的锁能放入锁表中,单个事务就可以锁住更多对象。这不是能被锁住的行数,那个值是没有限制的。默认值 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 —
设置每个事务的谓词锁最大数量。 现存