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

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 锁管理 本站手册 官方原文

共享锁表跟踪在max_locks_per_transaction * (max_connections + max_prepared_transactions) 个对象(如表)上的锁。因此,在任何一个时刻,只有不超过这么多个可区分对象能够被锁住。这个参数控制为每个事务分配的对象锁的平均数量。个体事务可以锁住更多对象,数量可以和锁表中能容纳的所有事务的锁一样多。这是能被锁住的行数,那个值是没有限制的。默认值 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
设置每个事务的谓词锁最大数量。 现存