他のバージョンの文書 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

45.50. pg_locks

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

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

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

表 45-51. pg_locksの列

名前参照先説明
locktypetext  ロック対象オブジェクトの種類。 relationextendpagetupletransactionidvirtualxid, objectuserlockadvisory
databaseoidpg_database.oidオブジェクトが存在しているデータベースのOID。オブジェクトが共有オブジェクトの場合はゼロ。オブジェクトがトランザクションIDである場合はNULL。
relationoidpg_class.oidリレーションのOID。オブジェクトがリレーションではない場合かリレーションの一部である場合はNULL。
pageinteger リレーション内のページ番号。オブジェクトが列もしくはリレーションではない場合はNULL。
tuplesmallint ページ内のタプル番号。 オブジェクトがタプルではない場合はNULL。
virtualxidtext トランザクションの仮想ID。オブジェクトが仮想トランザクションIDではない場合はNULL。
transactionidxid トランザクションのID。オブジェクトがトランザクションIDではない場合はNULL。
classidoidpg_class.oidオブジェクトを含むシステムカタログのOID。 オブジェクトが一般的なデータベースオブジェクトではない場合はNULL。
objidoidany OID columnシステムカタログ内のオブジェクトのOID。 オブジェクトが一般的なデータベースオブジェクトでない場合はNULL。 勧告的ロックでは、2つのキー空間を区別するのに使用されます(int8キーでは1、int4キーでは2)。
objsubidsmallint テーブル列の場合、これは列番号です(classidobjidはテーブル自身を参照します)。 他のすべての種類のオブジェクトでは、この列はゼロになります。 オブジェクトが一般的なデータベースオブジェクトではない場合はNULLとなります。
virtualtransactiontext  ロックを保持、もしくは待っている仮想トランザクションID。
pidinteger ロックを保持、もしくは待っているサーバプロセスのプロセスID。 準備されたトランザクションによりロックが保持されている場合はNULL。
modetext Name of the lock mode held or desired by this process (see 項13.3.1)
grantedboolean ロックが保持されている場合は真、ロックが待ち状態の場合は偽

指定されたトランザクションにより所有されているロックを表す行内では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は現行のデータベースに関連するロックのみならず、データベースクラスタ内のすべてのロックに関する全体的なビューを提供します。 relation列はロックされたリレーションを識別するためにpg_class.oidと結合することができますが、これは現行のデータベース内のリレーション(database列が現行のデータベースのOIDまたはゼロとなっているもの)に対してのみ正常に動作します。

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