正如a_horse_with_no_name评论的那样,你在pgadmin中看到的是常规锁,而不是死锁。
PostgreSQL提供了各种锁定模式来控制对表中数据的并发访问。在MVCC不能提供所需行为的情况下,这些模式可用于应用程序控制的锁定。此外,大多数PostgreSQL命令会自动获取适当模式的锁,以确保在命令执行时不会以不兼容的方式删除或修改引用的表。
pgadmin中的屏幕可能基于the pg_lock
system view。
锁在任何数据库的正常进程中发生。您不希望杀死定期生成锁定的会话,因为这会以各种方式影响您的应用程序和数据库。相反,您可能想要识别(可能使用pg_lock
视图),分析并优化导致问题的查询。
当谈到死锁的概念时:这是一个特殊的,异常的情况,当使用锁时可能会发生,其中两个会话相互等待另一个会话。它们通常表示应用程序逻辑中的问题。
大多数RDBMS自动识别并解决此类阻塞情况,并且Postgres is no exception:
PostgreSQL自动检测死锁情况并通过中止其中一个事务来解决它们,允许其他事件完成。 (究竟哪个交易将被中止很难预测,不应该依赖。)
以下是一些可以帮助您的查询:https://wiki.postgresql.org/wiki/Lock_Monitoring
查询可能需要一些微不足道的调整才能工作。查询有点长,所以我不会在这里粘贴它们,但只知道db表pg_catalog.pg_locks
和pg_catalog.pg_stat_activity
中提供了锁和查询状态信息。
您可以像普通表一样查询和加入它们,以构建您正在寻找的内容。
请注意,最好的情况是使用此信息来诊断并追溯到“死锁”的来源,而不是强制取消数据库中的查询。