無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

F.27. pgrowlocks

pgrowlocks モジュールは、指定したテーブルにおける行ロックの情報を示す関数を提供します。

F.27.1. 概要

pgrowlocks(text) returns setof record

パラメータはテーブルの名前です。 結果はレコードの集合となり、各レコードはテーブル内のロックされた1行を示します。 出力列は 表F-19 の通りです。

表 F-19. pgrowlocks の出力列

名前 説明
locked_row tid ロックされた行のタプルID(TID)
locker xid ロックを獲得したトランザクションのトランザクションID、もしマルチトランザクションの場合はmultixact ID
multi boolean ロックをマルチトランザクションが獲得していた場合は真
xids xid[] ロックを獲得しているトランザクションのトランザクションID(マルチトランザクションの場合は複数)
lock_type text[] ロックを獲得しているトランザクションのロックモード(マルチトランザクションの場合は複数)。 Key Share , Share For No Key Update No Key Update For Update Update の配列。
pids integer[] ロックを獲得しているバックエンドのプロセスID(マルチトランザクションの場合は複数)

pgrowlocks は対象テーブルに対して AccessShareLock を獲得し、ロック情報の収集のために1行ずつ行を読み取ります。 これは大規模テーブルにおいては高速とは言えません。 以下に注意してください:

  1. テーブル全体が他から排他ロックされている場合、 pgrowlocks はブロックされます。

  2. pgrowlocks では、自己矛盾のないスナップショットを生成することは保証されません。 その実行中に、新しい行ロックが獲得されることも、古いロックが解放されることもあり得ます。

pgrowlocks は、ロックされた行の内容は表示しません。 同時に行の内容を参照したい場合には、以下のようにして実現することができます:

SELECT * FROM accounts AS a, pgrowlocks('accounts') AS p
  WHERE p.locked_row = a.ctid;

しかし( PostgreSQL 8.3の時点では)こうした問い合わせが非常に非効率であることに注意してください。

F.27.2. サンプル出力

test=# SELECT * FROM pgrowlocks('t1');
 locked_row | lock_type | locker | multi |   xids    |     pids
------------+-----------+--------+-------+-----------+---------------
      (0,1) | Shared    |     19 | t     | {804,805} | {29066,29068}
      (0,2) | Shared    |     19 | t     | {804,805} | {29066,29068}
      (0,3) | Exclusive |    804 | f     | {804}     | {29066}
      (0,4) | Exclusive |    804 | f     | {804}     | {29066}
(4 rows)

F.27.3. 作者

Tatsuo Ishii


powered by SEO.CUG.NET