死锁检测,是pg的一种自动检测机制,可以发现两个或者多个session之间对互斥资源的申请造成的死锁,并且可以随机将其中一个事务回滚掉,以解除死锁。
PG的死锁时间由deadlock_timeout参数控制,默认是1s,当发生死锁超时,会随机将一个事务回滚掉,同时记录到数据库日志中。
deadlock_timeout
死锁检测之前在一个锁上等待的总时间。
This is the amount of time to wait on a lock before checking to see if there is a deadlock condition.
deadlock_timeout设置为1s,也即意味着,锁出现的一秒后,系统才会触发死锁检测机制,如果检测到死锁。会随机将其中任一事务回滚掉。
这个值越大,锁触发死锁检测等待的时间越长。这个值一般要超过大多数事务执行的时间。
特殊情况下,如果我们想定位死锁问题,我们可以先调大这个值,让因死锁而“挂起“的会话,维持“挂起”状态的时间更长点,以便我们定位具体SQL。
当死锁发生后,你可能在服务器日志或者会话报错中看到如下形式的日志信息:
ERROR: deadlock detected
DETAIL: Process 18446 waits for ShareLock on transaction 976; blocked by process 18478.
Process 18478 waits for ShareLock on transaction 975; blocked by process 18446.
HINT: See server log