PostgreSQL 9.1.5文書 | ||||
---|---|---|---|---|
前のページ | 巻戻し | 付録 F. 追加で提供されるモジュール | 早送り | 次のページ |
pgrowlocksモジュールは、指定したテーブルにおける行ロックの情報を示す関数を提供します。
pgrowlocks(text) returns setof record
パラメータはテーブルの名前です。 結果はレコードの集合となり、各レコードはテーブル内のロックされた1行を示します。 出力列は表F-19の通りです。
表 F-19. pgrowlocks
の出力列
名前 | 型 | 説明 |
---|---|---|
locked_row | tid | ロックされた行のタプルID(TID) |
lock_type | text | 共有ロックの場合はShared、排他ロックの場合はExclusive |
locker | xid | ロックを獲得したトランザクションのトランザクションID、もしマルチトランザクションの場合はmultixact ID |
multi | boolean | ロックをマルチトランザクションが獲得していた場合は真 |
xids | xid[] | ロックを獲得しているトランザクションのトランザクションID(マルチトランザクションの場合は複数) |
pids | integer[] | ロックを獲得しているバックエンドのプロセスID(マルチトランザクションの場合は複数) |
pgrowlocks
は対象テーブルに対してAccessShareLockを獲得し、ロック情報の収集のために1行ずつ行を読み取ります。
これは大規模テーブルにおいては高速とは言えません。
以下に注意してください:
テーブル全体が他から排他ロックされている場合、pgrowlocks
はブロックされます。
pgrowlocks
では、自己矛盾のないスナップショットを生成することは保証されません。
その実行中に、新しい行ロックが獲得されることも、古いロックが解放されることもあり得ます。
pgrowlocks
は、ロックされた行の内容は表示しません。
同時に行の内容を参照したい場合には、以下のようにして実現することができます:
SELECT * FROM accounts AS a, pgrowlocks('accounts') AS p WHERE p.locked_row = a.ctid;
しかし(PostgreSQL 8.3の時点では)こうした問い合わせが非常に非効率であることに注意してください。
test=# SELECT * FROM pgrowlocks('t1'); locked_row | lock_type | locker | multi | xids | pids ------------+-----------+--------+-------+-----------+--------------- (0,1) | Shared | 19 | t | {804,805} | {29066,29068} (0,2) | Shared | 19 | t | {804,805} | {29066,29068} (0,3) | Exclusive | 804 | f | {804} | {29066} (0,4) | Exclusive | 804 | f | {804} | {29066} (4 rows)
Tatsuo Ishii