PostgreSQL中deadlock_timeout工作机制确认及相关疑问
PostgreSQL deadlock_timeout 运行机制确认与补充
针对你对deadlock_timeout运行机制的理解,逐一确认和补充如下:
关于参数级别与检测逻辑:
deadlock_timeout支持会话级(SET deadlock_timeout = ...)和事务级(SET LOCAL deadlock_timeout = ...)设置,但死锁检测并非由每个事务独立执行,而是由PostgreSQL的锁管理器统一处理。当某个事务触发检测时,锁管理器会遍历全局的锁等待图来识别死锁环,不存在完全独立的事务级检测逻辑。死锁检测触发时机:
你的理解正确——当事务开始等待锁时,会先等待deadlock_timeout时长,若等待未结束则触发死锁检测。默认值为1秒,设置这个延迟是为了避免对短暂的锁等待频繁执行检测,减少性能开销。死锁发生后的处理规则:
死锁发生时,PostgreSQL不会让事务自行终止,也不会固定按PID选择终止对象,而是会选择代价最小的事务(通常指执行时间更短、修改数据量更少的事务)作为牺牲者,强制其回滚并抛出deadlock detected错误,以此打破死锁环。非死锁状态下的重复检测:
你的理解正确——若首次检测未发现死锁,只要事务仍在等待锁,就会每隔deadlock_timeout时长再次触发死锁检测,直到获取锁或被终止。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

