当前位置: 首页 > 知识库问答 >
问题:

postgres是否保证完全的死锁检测?

谭向晨
2023-03-14

我知道在等待之后deadlock_timeout开始死锁检测,并中止事务。然而,我有一种情况,事务似乎停滞了几个小时(等待SELECT… for UPDATE),没有解决。我的日志确实显示postgres检测到一些死锁,但我想知道是否有可能有更复杂的死锁,postgres无法检测到?

共有1个答案

欧阳炜
2023-03-14

PostgreSQL将检测完全在数据库中的所有死锁。如果它未能检测到这样的死锁,这将是您应该报告的一个错误(比您在这里展示的诊断更好)。

但是,PostgreSQL无法检测到部分位于数据库外部的死锁。在您的情况下,有另一个数据库会话持有冲突锁,因此您的SELECT… FORUPDATE被卡住,直到另一个会话结束其事务。现在,与另一个数据库会话的进程可能不会卡在数据库内部,而是被阻止在数据库外部(或者您只是忘记关闭事务,这是一个应用程序错误)。

如果您想让会话永远在锁后面等待,请适当设置lock_timeout。但是通常通过设置idle_in_transaction_session_timeout来防止会话无限期地保持事务打开会更好。但是正确的解决方案是修复您的应用程序。

 类似资料:
  • 问题内容: 我们遇到了一个奇怪的问题,其中似乎有两个线程正在调用,然后在方法内部永远等待。从外部看,内部看起来像是一个僵局。 到目前为止,我们只看到这种情况发生一次。 谁能想到任何可能导致这些症状的东西? 编辑 :相关线程的线程转储在这里: 问题答案: 可能不是您想要的答案,但这可能是JVM错误。看到 http://bugs.sun.com/bugdatabase/view_bug.do?bug_

  • 问题内容: 目前,我正在该项目中执行例程之一来处理源目录中的文件。有一个Java进程正在查找指定的目录,并尝试读取和处理文件(如果存在)。文件很大,其他第三方进程会更新它们。问题是如何检查文件是否完全写入?我正在尝试使用,但看起来即使编写过程尚未完成,它也会返回实际大小。我觉得解决方案应该取决于平台。任何帮助,将不胜感激。 更新:这个问题与重复的问题没有什么实质性的区别,但是它的答案是工作代码片段

  • 问题内容: 因此,我听说如果将2个字符串与==进行比较,则只有它们都引用相同的对象/实例时,我才会返回true。那是琴弦。布尔呢? 问题答案: ==是否检查布尔值是否完全相等?-Java 这取决于您是在谈论s(对象包装,请注意大写)还是s(原始,请注意小写)。如果您在谈论s(对象包装器),就像处理所有对象一样,请检查 身份 ,而不是对 等 。如果您在谈论s(基元),它将检查是否相等。 所以: 但

  • 主要内容:对于资源,对于进程在这种方法中,OS不应用任何机制来避免或防止死锁。 因此,系统认为死锁肯定会发生。 为了摆脱死锁,OS定期检查系统是否存在死锁。 如果发现死锁,操作系统将使用一些恢复技术来恢复系统。 操作系统的主要任务是检测死锁。 操作系统可以借助资源分配图来检测死锁。 在单个实例化的资源类型中,如果系统中正在形成一个循环,那么肯定会出现死锁。 另一方面,在多实例资源类型图中,检测周期不够。 我们必须通过将资源分

  • 我们正在尝试使用以下查询将数据流式传输到postgres 11: 基本上“在表中插入记录,如果它已经存在 - 我们希望将此查询连接到消息队列,并在多个实例中的高并发环境中运行它。使用此查询,可能会从不同的连接访问同一行。对我们来说,只有具有最高交付时间戳的项目最终才能进入表是至关重要的 根据文件: 在冲突时,DO UPDATE保证原子插入或更新结果;如果没有独立的错误,那么即使在高并发的情况下,这

  • 众所周知,有两种锁定策略:乐观锁定和悲观锁定 悲观锁定是锁定记录供您独占使用,直到您使用完它。它比乐观锁定具有更好的完整性,但是需要您小心应用程序设计以避免死锁。 也知道,乐观并发控制与多版本并发控制(Oracle或MSSQL-Snapshot/MVCC-RC)不同:乐观与多版本并发控制-差异? 但是,如果在两个事务中都使用OCC(乐观并发控制),会在两个交易之间发生死锁吗? 我们可以说乐观锁通过