pg_locks

PostgreSQL 9.1.1文書
前のページ | 巻戻し | 第 45章システムカタログ | 早送り | 次のページ

# 45.56. `pg_locks`

`pg_locks`ビューはデータベースサーバ内で開いているトランザクションにより獲得されたロックに関する情報へのアクセスを提供します。 ロックに関するより詳細な説明は第13章を参照してください。

`pg_locks`にはロック対象となる進行中のオブジェクト、要求されたロックモード、および関連するトランザクション毎に1つの行を持ちます。 ですから、もし複数のトランザクションがそのトランザクション上でロックを保持していたりロックを待機している場合には、同じロック対象オブジェクトが数多く出現することがあります。 しかし現在ロックされていないオブジェクトはまったく現れません。

ロック対象オブジェクトには異なる型がいくつか存在します。 リレーション全体（例：テーブル）、リレーションの個別のページ、リレーションの個別のタプル、トランザクションID（仮想と永続の両方のID）、一般的なデータベースオブジェクト（これは`pg_description`や`pg_depend`と同様にクラスOIDとオブジェクトOIDで識別されます）。 さらに、リレーションを拡張する権利は、別のロック対象オブジェクトとして表現されます。

表 45-57. `pg_locks`の列

名前 | 型 | 参照先 | 説明
--- | --- | --- | ---
`locktype` | `text` |  | ロック対象オブジェクトの種類。 `relation`、 `extend`、 `page`、 `tuple`、 `transactionid`、 `virtualxid`, `object`、 `userlock`、 `advisory`
`database` | `oid` | ``pg_database`.oid` | オブジェクトが存在しているデータベースのOID。オブジェクトが共有オブジェクトの場合はゼロ。オブジェクトがトランザクションIDである場合はNULL。
`relation` | `oid` | ``pg_class`.oid` | リレーションのOID。オブジェクトがリレーションではない場合かリレーションの一部である場合はNULL。
`page` | `integer` |  | リレーション内のページ番号。オブジェクトが列もしくはリレーションではない場合はNULL。
`tuple` | `smallint` |  | ページ内のタプル番号。 オブジェクトがタプルではない場合はNULL。
`virtualxid` | `text` |  | トランザクションの仮想ID。オブジェクトが仮想トランザクションIDではない場合はNULL。
`transactionid` | `xid` |  | トランザクションのID。オブジェクトがトランザクションIDではない場合はNULL。
`classid` | `oid` | ``pg_class`.oid` | オブジェクトを含むシステムカタログのOID。 オブジェクトが一般的なデータベースオブジェクトではない場合はNULL。
`objid` | `oid` | any OID column | システムカタログ内のオブジェクトのOID。 オブジェクトが一般的なデータベースオブジェクトでない場合はNULL。 勧告的ロックでは、2つのキー空間を区別するのに使用されます(int8キーでは1、int4キーでは2)。
`objsubid` | `smallint` |  | テーブル列の場合、これは列番号です（`classid`と`objid`はテーブル自身を参照します）。 他のすべての種類のオブジェクトでは、この列はゼロになります。 オブジェクトが一般的なデータベースオブジェクトではない場合はNULLとなります。
`virtualtransaction` | `text` |  | ロックを保持、もしくは待っている仮想トランザクションID。
`pid` | `integer` |  | ロックを保持、もしくは待っているサーバプロセスのプロセスID。 準備されたトランザクションによりロックが保持されている場合はNULL。
`mode` | `text` |  | このプロセスで保持または要求するロックモードの名称。 （項13.3.1 and 項13.2.3参照）
`granted` | `boolean` |  | ロックが保持されている場合は真、ロックが待ち状態の場合は偽

指定されたトランザクションにより所有されているロックを表す行内では`granted`は真です。 偽の場合はこのロックを取得するため現在トランザクションが待機中であることを示しています。 つまり、同じロック対象のオブジェクトに対して何らかの他のトランザクションが競合するロックを取得していることを意味します。 待機中のトランザクションはその別のトランザクションがロックを解放するまで活動を控えます （もしくはデッドロック状態が検出されることになります）。 単一トランザクションでは一度に多くても1つのロックを取得するために待機します。

すべてのトランザクションはそのすべての過程完了までその仮想トランザクションID上に排他的ロックをかけます。 もしある永続IDがトランザクションに割り当てられる（普通はトランザクションがデータベースの状態を変化させるときのみに発生します）と、トランザクションは終了するまで永続トランザクションIDに対して排他ロックを保持します。 あるトランザクションが他のトランザクションを特定して待機しなければならないと判断した場合、他とみなしたトランザクションのIDに対し共有ロックを取得するように試み、目的を達します （仮想IDであるか永続IDであるかは、その状況によります）。 これは、他とみなしたトランザクションが完了し、そしてロックを解放した場合のみ成功します。

タプルはロック対象のオブジェクト種類ですが、行レベルロックについての情報はメモリではなく、ディスクに保存されます。 よって行レベルロックは通常、このビューには現れません。 もしトランザクションが行レベルロックの待ち状態である場合は、その行ロックを保持している永続トランザクションIDを待つ状態で、そのトランザクションはビューに現れます。

勧告的ロックは、単一の`bigint`値、または、2つの整数値をキーとして獲得することができます。 `bigint`の場合は、その上位半分が`classid`列内に表示され、残りの下位半分は`objid`列内に表示されます。 また、`objsubid`は1となります。 整数値キーでは、最初のキーが`classid`列に、2番目のキーが`objid`列に表示され、`objsubid`は2となります。 キーの実際の意味はユーザに任されています。 勧告的ロックはデータベースに対して局所的ですので、勧告的ロックでは`database`列が意味を持ちます。

`pg_locks`ビューは、別々のシステムである、通常のロックマネージャと述部ロックマネージャの両方のデータを表示します。 `pg_locks`ビューがアクセスされると、各ロックマネージャの内部データ構造は一時的にロックされ、コピーがビューとして表示用に作成されます。 したがって各ロックマネージャは一貫性をもった結果セットを生成します。 しかし同時に両方のロックマネージャをロックしませんので、 通常のロックマネージャを調査した後、および述部ロックを調査する前に獲得または解放されたロックがある可能性があります。 各ロックマネージャは、このビューの問い合わせによる性能への影響を減らすために極力最小の時間だけロックしますが、それにも関わらずこのビューが頻繁にアクセスされるとするとデータベースの性能に何らかの影響を及ぼすでしょう。

`pg_locks`は現行のデータベースに関連するロックのみならず、データベースクラスタ内のすべてのロックに関する全体的なビューを提供します。 `relation`列はロックされたリレーションを識別するために`pg_class`.`oid`と結合することができますが、これは現行のデータベース内のリレーション（`database`列が現行のデータベースのOIDまたはゼロとなっているもの）に対してのみ正常に動作します。

ロック保持もしくは保持を待機しているセッションのさらなる情報を入手するため`pg_stat_activity`ビューの`procpid`列と`pid`列を結合することができます。 また、準備されたトランザクションを使用している場合には、`transaction`は`pg_prepared_xacts`ビューの`transaction`列と結合でき、ロックを保持している準備されたトランザクションに関して、より多くの情報を取得できます。 （準備されたトランザクションはロックを待つことはありませんが、実行時に取得したロックを保持し続けます。）

前のページ | ホーム | 次のページ
`pg_indexes` | 上に戻る | `pg_prepared_statements`