この他に、データベース活動状況の監視に役立つツールとして pg_locks システムカタログがあります。これにより、データベース管理者はロックマネージャ内の未解決のロックに関する情報を参照することができます。たとえば、この機能を使用すると以下のことができます。
現在未解決のロック、特定データベースのリレーションのロック、特定のリレーションのロック、または特定の PostgreSQL セッションが保持するロックを、すべて表示する。
最も許可されにくいロック (データベースクライアント間で競合の原因になる可能性がある) との、現在のデータベースにおけるリレーションを表示する。
全データベーストラフィックによって変化する競合の範囲に加えて、全体的なデータベースのパフォーマンスに対するロック競合の影響を判断する。
PostgreSQL での同時実行のロックおよび管理についての詳細は、PostgreSQL 7.3 ユーザガイド を参照してください。
Note: pg_locks ビューにアクセスすると、内部ロックマネージャのデータ構造は一時的にロックされ、このビューに表示するためのコピーが作成されます。これにより、通常のロックマネージャ操作を必要以上に長く中断することなく、整合性のある結果のセットをビューで生成することができます。それでもなお、このビューが頻繁に参照されると、データベースパフォーマンスに多少影響を及ぼす可能性が出てきます。
Table 10-3 に pg_locks 列の定義が示されています。pg_locks ビューには、ロック可能オブジェクトと要求されたロックモードごとに 1 つの行が表示されます。したがって、複数のトランザクションが同じロック可能オブジェクトのロックを保持または待機している場合は、同じオブジェクトが複数回表示されることがあります。ロック可能オブジェクトは、リレーションまたはトランザクション ID のどちらかです。(このビューには行レベルロックではなく、テーブルレベルロックしか表示されないことに注意してください。あるトランザクションが行レベルロックについて待機している場合、ビューにはその行ロックを現在保持しているトランザクション ID について待機していると表示されます。)
Table 10-3. ロック状態のシステムビュー
列名 | 型 | 説明 |
---|---|---|
relation | oid | ロックされたリレーションの OID。またはロック可能オブジェクトがトランザクション ID の場合は NULL。 この列を pg_class システムカタログと結合すると、ロックされたリレーションの詳細が取得できます。ただし、このことは現行データベースのリレーションでのみ有効です (database 列が、現在のデータベースの OID またはゼロのいずれかであるもの)。 |
database | oid | ロックされたリレーションが存在するデータベースの OID。またはロック可能オブジェクトがトランザクション ID の場合は NULL。ロックがグローバル共有テーブル上の場合、このフィールドはゼロになります。この列を pg_database システムカタログに結合すると、ロックされたオブジェクトのデータベースの詳細が取得できます。 |
transaction | xid | トランザクションの ID。またはロック可能オブジェクトがリレーションの場合は NULL。各トランザクションは存続期間中、トランザクション ID の排他ロックを保持します。 あるトランザクションが別のトランザクションを特に待機する必要があると判断した場合、待機してその別のトランザクション ID の共有ロックを取得しようと試みます。 これは別のトランザクションが終了し、そのロックを解除する場合にのみ成功します。 |
pid | integer | ロックを取得した、または取得しようとしているセッションに属する PostgreSQL バックエンドのプロセス ID。 統計情報収集器を有効にしている場合は、この列を pg_stat_activity ビューに結合して、ロックを保持している、または保持できるまで待機しているバックエンドについての詳細を取得することができます。 |
mode | text | ロック可能オブジェクトにおける要求されたロックまたは保持されたロックのモード。 PostgreSQL で使用可能なさまざまなロックモードについての詳細は、PostgreSQL 7.3 ユーザガイド を参照してください。 |
isgranted | boolean | このロックが許可されている (このセッションによって保持されている) 場合は真。 偽の場合は、このセッションが現在このロックを取得待機中であることを示します。これは、他のセッションが同じロック可能Iブジェクトについて競合するロックモードを保持していることを意味します。このバックエンドは、他のロックが解放される (またはデッドロック状態が検出される) までスリープします。 1 つのバックエンドが取得のために待機できるロックは、一度に 1 つだけです。 |