我理解在等待之后,deadlock_timeout开始检测死锁,并中止事务处理。然而,我有一种情况,事务似乎正在停滞(等待一个选择.(用于更新)数小时内没有解决问题。我的日志确实显示postgres检测到了一些死锁,但我想知道是否有更复杂的死锁是postgres无法检测到的?
发布于 2022-03-23 04:02:28
PostgreSQL将检测所有完全在数据库中的死锁。如果它不能检测到这样的死锁,那将是一个您应该报告的错误(具有比这里显示的更好的诊断)。
但是,PostgreSQL无法检测到部分在数据库之外的死锁。在您的示例中,有另一个数据库会话持有冲突的锁,因此您的SELECT ... FOR UPDATE会一直停留到另一个会话结束其事务为止。现在,其他数据库会话的进程可能不会卡在数据库中,而是阻塞在数据库之外(或者您只是忘记关闭事务,这是一个应用程序错误)。
如果您想让会话一直在锁后面等待,请适当地设置lock_timeout。但是通常情况下,最好是通过设置idle_in_transaction_session_timeout来防止会话无限期地打开事务。但正确的解决方案是修复应用程序。
https://stackoverflow.com/questions/71574208
复制相似问题