rkr*_*rzr 3 postgresql locking postgresql-9.4
我们最近在 Posgres 9.4 中遇到了一些死锁问题。有些查询根本没有返回,并且会无限期地挂起。经过一番调查,我们发现进程死锁似乎是问题所在。当从锁定监控Postgres Wiki运行查询时,我们会看到一大堆被阻止的进程。解决这些问题的唯一方法是开始终止其中一些进程,直到 Postgres 能够再次解决问题。
现在我的理解是,Postgres 中的死锁检测器应该能够发现存在死锁,然后通过回滚其中一个被阻止的事务来解决它,以便另一个事务可以继续,然后重试第一个事务。但在我们的例子中,情况并非如此,这些进程只是无限期地陷入僵局,直到我们杀死它们。
设置deadlock_timeout为 1 秒(默认值),并且我找不到用于打开或关闭死锁检测器的标志,因此我假设它始终打开。
所以我的问题是死锁检测器是否只能检测某些类型的死锁,如果可以,是哪些类型?
为什么锁监控 Wiki 上显示的查询可以检测到死锁进程,但死锁检测器本身却不能?
仅当 Postgres 看到两个事务相互等待时,它才会发现死锁。特别是对于两个(或更多)进程,场景必须是:
死锁处理不会处理以下情况:
根据您的描述,听起来您的数据库会话之一没有释放其资源。也许它缺少 COMMIT 等。就 Postgres 而言,这不是死锁,因为它知道锁持有这么长时间是有一个完全有效的原因的。
您可以做的一件事是设置锁定超时。这意味着进程在放弃并标记问题之前等待尝试获取锁的时间是有上限的。
锁定超时和其他设置记录在: http://www.postgresql.org/docs/9.3/static/runtime-config-client.html
| 归档时间: |
|
| 查看次数: |
2467 次 |
| 最近记录: |