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