gpt4 book ai didi

django - 使用 pgadmin 检查 Postgres 建议锁的状态

转载 作者:行者123 更新时间:2023-11-29 11:43:19 26 4
gpt4 key购买 nike

我正在尝试在我的 Django 应用程序中使用 Postgres 咨询锁,但似乎获取被卡住了。

我想使用 pgadmin GUI 查看哪些锁已获取,哪些未获取。我尝试使用它,并导航到 pg_locks 并在那里四处看了一会儿,但我找不到在哪里可以看到获得了哪些锁。我怎么能看到?

最佳答案

建议锁在pg_locks中列出,locktype = advisory 和包含锁定值的objid:

regress=> SELECT pg_advisory_lock(12345);
pg_advisory_lock
------------------

(1 row)

regress=> SELECT * FROM pg_locks;
locktype | database | relation | page | tuple | virtualxid | transactionid | classid | objid | objsubid | virtualtransaction | pid | mode | granted | fastpath
------------+----------+----------+------+-------+------------+---------------+---------+-------+----------+--------------------+-------+-----------------+---------+----------
relation | 144654 | 11090 | | | | | | | | 2/24979 | 22097 | AccessShareLock | t | t
virtualxid | | | | | 2/24979 | | | | | 2/24979 | 22097 | ExclusiveLock | t | t
advisory | 144654 | | | | | | 0 | 12345 | 1 | 2/24979 | 22097 | ExclusiveLock | t | f
(3 rows)

regress=> SELECT objid, mode, granted FROM pg_locks WHERE locktype = 'advisory';
objid | mode | granted
-------+---------------+---------
456 | ExclusiveLock | t
12345 | ExclusiveLock | t
(2 rows)

对于双值锁,第一部分在classid中,objsubid2(而不是1 用于单参数锁):

regress=> SELECT pg_advisory_lock(123, 456);
pg_advisory_lock
------------------

(1 row)

regress=> SELECT classid, objid, mode, granted, objsubid FROM pg_locks WHERE locktype = 'advisory';
classid | objid | mode | granted | objsubid
---------+-------+---------------+--------------------
123 | 456 | ExclusiveLock | t | 2
(1 row)

更新:

mode 字段是锁定模式。

regress=> SELECT pg_advisory_lock_shared(1234);
pg_advisory_lock_shared
-------------------------

(1 row)

regress=> SELECT classid, objid, objsubid, mode, granted FROM pg_locks WHERE locktype = 'advisory';
classid | objid | objsubid | mode | granted
---------+-------+----------+-----------+---------
0 | 1234 | 1 | ShareLock | t
(1 row)

如果一个给定的锁根本没有被获取,那么它就没有行。

regress=> SELECT classid, objid, objsubid, mode, granted 
FROM pg_locks
WHERE locktype = 'advisory'
AND objsubid = 1 /* One-argument form lock */
AND objid = 1235; /* argument = 1235 */

classid | objid | objsubid | mode | granted
---------+-------+----------+------+---------
(0 rows)

如果一个锁在等待另一个 session 时被阻止,它将有 granted = 'f'

您可以使用 pid 字段查看哪个进程 ID 持有/正在尝试获取锁。在 pg_stat_activity 上加入可能很有用,在 pg_locks 上自加入也很有用,可以查看哪个 session 阻止了给定的锁。

有关详细信息,请参阅 the user manual for pg_locks

关于django - 使用 pgadmin 检查 Postgres 建议锁的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25213808/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com