PostgreSQL 的 lock_timeout 参数
lock_timeout
是 PostgreSQL 中控制锁等待超时的重要参数,它决定了事务在获取锁时最多等待多长时间。
一 基本特性
- 作用:控制事务等待获取锁的最长时间
- 默认值:0(表示不超时,无限等待)
- 生效范围:可以设置在服务器、数据库、用户、会话或事务级别
- 单位:支持多种时间单位(ms, s, min, h等)
二 参数设置
2.1 配置文件设置(永久生效)
# postgresql.conf
lock_timeout = '5s' # 设置全局默认锁超时为5秒
2.2 会话级设置(当前连接有效)
SET lock_timeout = '2s'; -- 设置当前会话锁超时为2秒
2.3 事务级设置(仅当前事务有效)
BEGIN;
SET LOCAL lock_timeout = '3s'; -- 仅当前事务有效
-- 执行事务操作
COMMIT;
三 锁超时行为
当达到超时时间仍未获得锁时:
- PostgreSQL 会中止当前语句
- 返回错误:
ERROR: canceling statement due to lock timeout
- 注意:只有等待锁的语句会被中止,事务本身不会自动回滚
四 与其它超时参数的关系
- statement_timeout:控制整个语句的执行时间(包括锁等待和实际执行)
- idle_in_transaction_session_timeout:控制空闲事务的超时
- deadlock_timeout:死锁检测间隔(默认为1s)
五 注意事项
lock_timeout
只影响锁等待时间,不影响已经获得的锁的持有时间- 设置为0时,事务可能无限期等待,导致连接堆积
- 在热备服务器上,这个参数控制的是取消等待备库上锁的时间
- 某些特殊操作(如CREATE INDEX CONCURRENTLY)有自己的超时控制机制