使用pgadmin检查Postgres咨询锁的状态

时间:2014-08-08 23:48:36

标签: django postgresql pgadmin

我试图在我的Django应用程序中使用Postgres咨询锁,似乎冻结了收购。

我想使用pgadmin GUI来查看获取哪些锁以及哪些锁不是。我尝试使用它,然后导航到pg_locks并在那里看了一会儿,但我无法找到可以看到哪些锁被获取的地方。我怎么能看到这个?

2 个答案:

答案 0 :(得分:4)

咨询锁列在pg_locks中,其中locktype = advisoryobjid包含锁定值:

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)

对于双值锁,第一部分位于classidobjsubid2(而不是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表示此事务当前正在等待获取此锁定,这意味着某个其他事务在同一个可锁定对象上保持冲突的锁定模式。