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
