43.32. pg_locks

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

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

このビューは行レベルのロックではなくテーブルレベルのロックだけを所有していることを覚えておいてください。もしトランザクションが行レベルロックを待機しているのであれば、その行のロックの現時点の所有者のトランザクション ID に対して待機しているとビュー上に現れます。

表 43-32. pg_locks

名前参照先説明
relationoidpg_class.oid ロックされたリレーションの OID、もしくはロック対象オブジェクトがトランザクション ID の場合は NULL。
databaseoidpg_database.oid ロックされたリレーションが存在するデータベースの OID、もしくはロックされたリレーションが全体にわたって共有されているテーブルの場合はゼロ、もしくはロックされたオブジェクトがトランザクション ID の場合は NULL。
transactionxid  トランザクションの ID、もしくはロックされたオブジェクトがリレーションの場合は NULL。
pidinteger このロックを所有もしくは待機しているサーバプロセスのプロセス ID
modetext このプロセスが所有しているもしくは目論んでいるロック名 (項12.3.1 を参照)
grantedboolean ロック中であれば真、ロックを待機中であれば僞

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

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

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

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

もし統計情報収集機能が可能となっている場合には、ロック保持もしくは保持を待機しているセッションの更なる情報を入手するため pg_stat_activity ビューの procpid 列と pid 列は結合できます。