PostgreSQL 9.1.5文書 | ||||
---|---|---|---|---|
前のページ | 巻戻し | 第 45章システムカタログ | 早送り | 次のページ |
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。 |
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は現行のデータベースに関連するロックのみならず、データベースクラスタ内のすべてのロックに関する全体的なビューを提供します。 relation列はロックされたリレーションを識別するためにpg_class.oidと結合することができますが、これは現行のデータベース内のリレーション(database列が現行のデータベースのOIDまたはゼロとなっているもの)に対してのみ正常に動作します。
ロック保持もしくは保持を待機しているセッションのさらなる情報を入手するためpg_stat_activityビューのprocpid列とpid列を結合することができます。 また、準備されたトランザクションを使用している場合には、transactionはpg_prepared_xactsビューのtransaction列と結合でき、ロックを保持している準備されたトランザクションに関して、より多くの情報を取得できます。 (準備されたトランザクションはロックを待つことはありませんが、実行時に取得したロックを保持し続けます。)
pg_locksビューは、別々のシステムである、通常のロックマネージャと述部ロックマネージャの両方のデータを表示します。 pg_locksビューがアクセスされると、各ロックマネージャの内部データ構造は一時的にロックされ、コピーがビューとして表示用に作成されます。 したがって各ロックマネージャは一貫性をもった結果セットを生成します。 しかし同時に両方のロックマネージャをロックしませんので、 通常のロックマネージャを調査した後、および述部ロックを調査する前に獲得または解放されたロックがある可能性があります。 各ロックマネージャは、このビューの問い合わせによる性能への影響を減らすために極力最小の時間だけロックしますが、それにも関わらずこのビューが頻繁にアクセスされるとするとデータベースの性能に何らかの影響を及ぼすでしょう。