我试图在我的Django应用程序中使用Postgres咨询锁,似乎冻结了收购。
我想使用pgadmin
GUI来查看获取哪些锁以及哪些锁不是。我尝试使用它,然后导航到pg_locks
并在那里看了一会儿,但我无法找到可以看到哪些锁被获取的地方。我怎么能看到这个?
答案 0 :(得分:4)
咨询锁列在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
,objsubid
为2
(而不是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)
如果某个锁被阻止等待另一个会话,则它会granted = 'f'
。
您可以使用pid
字段查看哪个进程ID包含/正在尝试获取锁定。加入pg_stat_activity
非常有用,pg_locks
上的自联接可以查看哪个会话阻止给定锁定。
有关详细信息,请参阅 the user manual for pg_locks
。
答案 1 :(得分:0)
您可以从提供的数据中自行枚举。以下是documentation的说明:
在表示由指示的事务持有的锁的行中被赋予true。 False表示此事务当前正在等待获取此锁定,这意味着某个其他事务在同一个可锁定对象上保持冲突的锁定模式。