在PostgresQL中列出并终止所有死锁查询

问题描述 投票:1回答:2

我想在PostgreSQL中清理我的数据库进程,因为很少有查询处于死锁状态,因此整个数据库正在变慢。

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

我从PgAdmin得到了这个观点。

enter image description here

sql postgresql locking deadlock
2个回答
1
投票

正如a_horse_with_no_name评论的那样,你在pgadmin中看到的是常规锁,而不是死锁。

来自the Postgres documentation

PostgreSQL提供了各种锁定模式来控制对表中数据的并发访问。在MVCC不能提供所需行为的情况下,这些模式可用于应用程序控制的锁定。此外,大多数PostgreSQL命令会自动获取适当模式的锁,以确保在命令执行时不会以不兼容的方式删除或修改引用的表。

pgadmin中的屏幕可能基于the pg_lock system view

锁在任何数据库的正常进程中发生。您不希望杀死定期生成锁定的会话,因为这会以各种方式影响您的应用程序和数据库。相反,您可能想要识别(可能使用pg_lock视图),分析并优化导致问题的查询。


当谈到死锁的概念时:这是一个特殊的,异常的情况,当使用锁时可能会发生,其中两个会话相互等待另一个会话。它们通常表示应用程序逻辑中的问题。

大多数RDBMS自动识别并解决此类阻塞情况,并且Postgres is no exception

PostgreSQL自动检测死锁情况并通过中止其中一个事务来解决它们,允许其他事件完成。 (究竟哪个交易将被中止很难预测,不应该依赖。)


0
投票

以下是一些可以帮助您的查询:https://wiki.postgresql.org/wiki/Lock_Monitoring

查询可能需要一些微不足道的调整才能工作。查询有点长,所以我不会在这里粘贴它们,但只知道db表pg_catalog.pg_lockspg_catalog.pg_stat_activity中提供了锁和查询状态信息。

您可以像普通表一样查询和加入它们,以构建您正在寻找的内容。

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

© www.soinside.com 2019 - 2024. All rights reserved.