我正在尝试查找锁定sql查询,并且我使用了这段代码,
但是当我想取消查询列表时,却没有成功。
你能帮忙吗?
SELECT
*
FROM
stv_locks;
首先你不应该这样做。 删除锁可能会导致数据丢失和一致性问题。 这些问题可能会在很晚的时候出现,使得修复数据变得困难或不可能。 不建议这样做。
第二,为什么需要这样做? 您看到了什么让您想要这样做? 我曾有客户想要这样做,因为他们没有正确使用交易。 简而言之,长时间运行的会话而不关闭事务可能会导致一长串可能的锁定问题。
好吧,尝试提供一些可能有帮助的信息。 STV_LOCKS 不返回系统中的所有锁。 它是一个视图,仅报告写锁。 MVCC 数据库中的读锁数量要多得多。 要获得这些,您需要查看 PG_LOCKS 表。 但是,我不认为您可以仅对此执行 SELECT * ,并且需要一个 WHERE 子句来运行查询。 相关表的 OID 足以探索情况。 当我需要追踪表上的读锁时,我会执行以下操作:
select * from pg_locks where relation = (select oid from pg_class where relname = 'the_table');
但是在你开始吹掉更多的锁之前,我建议你弄清楚发生了什么。 一旦开始,就可以查看按开始时间排序的所有活动会话。
SELECT * FROM STV_SESSIONS order by starttime;
如果您的用户会话已经超过一天,您可能想询问为什么会出现这种情况。
或者在 SVV_TRANSACTIONS 中查找长时间运行的事务(作为超级用户)。 如果您受到长期锁的影响。 您的团队很可能只需要一些关于结束交易的教育。