pgrowlocks

PostgreSQL 8.4.1文書
前のページ | 巻戻し | 付録 F. 追加で提供されるモジュール | 早送り | 次のページ

# F.25. pgrowlocks

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

## F.25.1. 概要

    pgrowlocks(text) returns setof record

パラメータはテーブルの名前です。 結果は、テーブル内のロックされた行毎に1行のレコードの集合です。 出力列は表F-22の通りです。

表 F-22. `pgrowlocks`の出力列

名前 | 型 | 説明
--- | --- | ---
`locked_row` | `tid` | ロックされた行のタプルID（TID）
`lock_type` | `text` | 共有ロックの場合`Shared`、排他ロックの場合`Exclusive`
`locker` | `xid` | ロックを獲得したトランザクションのトランザクションID、もし複数トランザクションの場合はmultixact ID
`multi` | `boolean` | ロックを複数トランザクションで獲得していた場合真
`xids` | `xid[]` | ロックを獲得したトランザクションのトランザクションID（複数トランザクションの場合は複数）
`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.25.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.25.3. 作者

石井 達夫

前のページ | ホーム | 次のページ
pg_freespacemap | 上に戻る | pg_standby