列出并杀死PostgresSQL中的所有死锁查询

时间:2019-03-03 19:58:53

标签: sql postgresql locking deadlock

我想在PostgreSQL中清理数据库进程,因为几乎没有查询处于死锁状态,因此整个数据库的速度变慢了。

所以我想知道列出所有死锁查询并定期清理死锁的最佳实践。

我从PgAdmin获得了此视图。

enter image description here

2 个答案:

答案 0 :(得分:1)

a_horse_with_no_name评论说,您在pgadmin中看到的是常规锁,而不是死锁

来自the Postgres documentation

  

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_lockspg_catalog.pg_stat_activity中可用。

您可以像查询普通表一样查询并加入它们,以构建所需的内容。

请注意,尽管最好的情况是使用此信息来诊断并追溯到“死锁”的来源,而不是强行取消数据库中的查询。