42.37. pg_locks

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

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

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

表 42-37. pg_locksの列

名前参照先説明
locktypetext  ロック対象オブジェクトの型は リレーション, エクステンド, ページ, , トランザクションID, オブジェクト,もしくは ユーザロック です。
databaseoidpg_database.oid オブジェクトが存在しているデータベースのOID、もしくはオブジェクトが共有されたオブジェクトの場合はゼロ、もしくはオブジェクトがトランザクションIDである場合はNULLとなります。
relationoidpg_class.oid リレーションのOID、もしくはオブジェクトがリレーションではない場合かリレーションの一部である場合はNULLとなります。
pageinteger  リレーション内のページ数、もしくはオブジェクトが列もしくはリレーションではない場合はNULLとなります。
tuplesmallint  ページ内の列数、もしくはオブジェクトが列ではない場合はNULLとなります。
transactionidxid  トランザクションのID、もしくはオブジェクトがトランザクションIDではない場合はNULLとなります。
classidoidpg_class.oid オブジェクトを含んだシステムカタログのOID、もしくはオブジェクトが一般的なデータベースオブジェクトではない場合はNULLとなります。
objidoidany OID column システムカタログ内のオブジェクトのOID、もしくはオブジェクトが一般的なデータベースオブジェクトでない場合はNULLとなります。
objsubidsmallint  テーブルの列に対しては、これは列数(classidobjidはテーブル自身を参照しています)です。 他の全てのオブジェクトの型に対しては、この列はゼロになります。オブジェクトが一般的なデータベースオブジェクトではない場合はNULLとなります。
transactionxid  ロックを保持、もしくは待っているトランザクションのID
pidinteger  ロックを保持、もしくは待っているサーバプロセスのプロセスID。ロックが準備されているトランザクションにより保持されている場合はNULLとなります。
modetext name of the lock mode held or desired by this process (see 項12.3.1)
grantedboolean ロックが保持されている場合は真、ロックが待ち状態の場合は偽

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

全てのトランザクションはその全ての過程完了までそのトランザクションID上に排他的ロックをかけます。もしもあるトランザクションが他のトランザクションを特定して待機しなければならないと判断した場合、他とみなしたトランザクションのIDに対し共有ロックを取得するように試み、目的を達します。これは、他とみなしたトランザクションが完了し、そしてロックを解放した場合のみ成功します。

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

もしユーザ定義のロックが使用されている場合、それらは一般的なデータベースオブジェクトの列として表示されます。しかしこのような場合のロック列の実際の意味は、ユーザの責任となります。

pg_locksビューにアクセスがかかると内部ロック管理データ構造は一時的にロックされ、複製がビューとして表示用に作成されます。このことにより通常のロック管理操作を必要以上に妨げないで、ビューは矛盾を含まない結果一式の生成が保証されます。それにもかかわらずこのビューが頻繁に読み込まれるとするとデータベースのパフォーマンスに何らかの影響を及ぼすでしょう。

pg_locksは現行のデータベースに関連するロックのみならず、データベースクラスタ内の全てのロックの全体のビューを提供します。そのrelation列がpg_class.oidに対しロックされたリレーションであることを表明するために結合可能であっても、現行のデータベース内のリレーション(それに対するdatabase列が現行のデータベースのOIDもしくはゼロ)についてのみ正しく働きます。

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