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

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

百科 / 配置参数 / 锁管理

CONFIGURATION PARAMETER锁管理

max_locks_per_transaction

设置每个事务的锁数量上限。

Sets the maximum number of locks per transaction.

整数 重启生效 引入 9.0(基线) 现存至 20 devel 1 次默认值变更

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

PostgreSQL 18 手册 官方文档

版本轨迹

相对 PostgreSQL 17 无变化。

默认值变迁

64 9.0 – 18 128 19 – 20

默认值一共换过 2 档,每段的宽度按它覆盖的大版本数伸展,深色的一段是当前查看的 PostgreSQL 18。带单位的取值换算成了可读形式,原始的 boot_val 与单位写在悬浮提示里。

手册说明

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

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

共享锁表为每个服务器进程或预备事务预留可容纳max_locks_per_transaction 个对象(例如表)的空间;因此,在任何时刻可被锁住的不同对象数都不能超过总容量。这个参数限制每个事务使用的对象锁的平均数量;只要所有事务的锁能放入锁表中,单个事务就可以锁住更多对象。这不是能被锁住的行数,那个值是没有限制的。默认值 64 已经被历史证明是足够的,但是如果你有需要在一个事务中使用很多不同表的查询(例如查询一个有很多子表的父表),你可能需要提高这个值。这个参数只能在服务器启动时设置。

运行备库时,必须将此参数设置为大于或等于主库上的值。否则,备库上将不允许查询。

机制详解

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

共享锁表按每个后端或预备事务平均这么多个不同对象来分配。只要全局仍有空间,单个事务可超过该数;它不限制行锁,而且备库的值不得低于主库。

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

调优建议

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

  • OLTP在线事务处理

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

  • OLAP分析与批处理

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

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

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

常见问题

  • 把它理解成行锁上限或单事务硬上限。
  • 提高时不核算 max_connections 与预备事务。
  • 备库设置低于主库导致无法查询。
  • 把平均共享内存规划值当成单事务硬上限。
  • 提高参数却不核算连接数与预备事务带来的乘数。

演化历史

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

  1. PostgreSQL 20 ← 19 沿用 19

    事实沿用 19

  2. PostgreSQL 19 ← 18 默认值变更

    默认值 64 128

  3. PostgreSQL 17 ← 16 仅描述更新

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

  4. PostgreSQL 16 ← 15 仅描述更新

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

逐版本快照

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

版本 默认值单位上下文类型最小值最大值枚举值
9.0 64 空 重启生效 整数 10 2147483647 —
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 128 — 重启生效 整数 10 2147483647 —
20 沿用 128 — 重启生效 整数 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 —
设置每个事务的谓词锁最大数量。 现存