log_lock_failures
是一个 配置参数,用于决定当锁获取失败时是否生成详细的日志消息。
log_lock_failures
于 PostgreSQL 18 中添加。
默认
log_lock_failures
的默认值为:off
。
用法
截至 PostgreSQL 18,仅记录由于 SELECT ... NOWAIT
导致的锁失败。
按 PostgreSQL 版本详细信息
log_lock_failures (PostgreSQL 19)
设置 | off |
单位 | |
类别 | 报告和日志记录 / 记录什么 |
简短描述 | 记录锁失败。 |
扩展描述 | |
上下文 | superuser |
变量类型 | bool |
来源 | 默认 |
最小值 | |
最大值 | |
枚举值 | |
启动值 | off |
重置值 | off |
源文件 | |
源行 | |
需要重启 | false |
log_lock_failures (PostgreSQL 18)
设置 | off |
单位 | |
类别 | 报告和日志记录 / 记录什么 |
简短描述 | 记录锁失败。 |
扩展描述 | |
上下文 | superuser |
变量类型 | bool |
来源 | 默认 |
最小值 | |
最大值 | |
枚举值 | |
启动值 | off |
重置值 | off |
源文件 | |
源行 | |
需要重启 | false |
变更历史
示例
一个会话中的 log_lock_failures
的基本用法示例 - 假设以下事务在一个会话中执行
postgres=# BEGIN; BEGIN postgres=*# SELECT * FROM foo FOR UPDATE NOWAIT; id ---- 1 (1 row)
同一个事务在另一个会话中会失败
postgres=# BEGIN; BEGIN postgres=*# SELECT * FROM foo FOR UPDATE NOWAIT; ERROR: could not obtain lock on row in relation "foo" postgres=!#
并且日志文件将包含类似以下的条目
[2025-03-15 15:44:47 UTC] psql postgres postgres LOG: 00000: process 341755 could not obtain ShareLock on transaction 767 [2025-03-15 15:44:47 UTC] psql postgres postgres DETAIL: Process holding the lock: 342443, Wait queue: . [2025-03-15 15:44:47 UTC] psql postgres postgres STATEMENT: SELECT * FROM foo FOR UPDATE NOWAIT; [2025-03-15 15:44:47 UTC] psql postgres postgres ERROR: 55P03: could not obtain lock on row in relation "foo"
参考资料
- PostgreSQL 文档: log_lock_failures