postgresql的死锁检测机制

本文介绍了PostgreSQL的死锁检测机制,包括由deadlock_timeout参数控制的检测时间,以及当死锁发生时如何回滚事务并记录日志。讨论了如何通过调整参数和优化事务顺序预防死锁,建议减少锁使用、避免大事务及实现业务侧重试机制。
摘要由CSDN通过智能技术生成

死锁检测,是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 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值