表のロック

LOCK TABLE コマンドは、現在のデータベース内の表をロックするために使用します。 ロック・モードは獲得するロックのタイプを指定します。

LOCK TABLE コマンドは、表に対して指定されたモードのロックを獲得できたときに成功します。 このコマンドでは、ロック獲得に必要な時間待機します。ただし、NOWAIT オプションを指定した場合、コマンドでロックをただちに獲得できないと、トランザクションは打ち切られます。

ロックはトランザクションがコミットされるか打ち切られるまで保持されます。 LOCK TABLE が暗黙的に (つまり、BEGIN/COMMIT ペアではなく) 発行された場合、コマンドは許可された時点でロックを獲得し、その後ただちにロックを解放します。これはコマンドが、コマンド完了時に暗黙的にコミットするシングル・ステートメント・トランザクションであったためです。

可能な場合、トランザクション内のどの照会よりも前に、LOCK TABLE コマンドを発行する必要があります。 ユーザー表に対して照会を発行した後にロックを獲得しても、必ずしも逐次化エラーからトランザクションを保護することにはなりません。

トランザクション内で複数の表に対する LOCK TABLE コマンドを発行する計画をしている場合、アプリケーションが設定した順にコマンドを発行します。 これにより、デッドロックの可能性が最小化されます。 デッドロックが発生した場合、Postgres はデッドロックに関与したいずれかのトランザクションを打ち切ります。

ロック・モードの競合

以下の表に、ロック競合のマトリックス、つまり、どのロックが、他のどのタイプのロックをブロックするかを示します。 別のトランザクションが同じ表に対する対立するロックを保持しているときに、トランザクションにロックを付与できなかった場合、ロック・モードは別のモードと競合しています。 同じトランザクションが保持する複数のロックは、互いに競合しません。1 つのトランザクションで、同じ表に対して複数のモードのロックを保持できます。 同じ表に対する複数のロックを獲得する場合、デッドロックの可能性を最小化するため、より強いロックを最初に要求してください。 あるトランザクションが同じ表に対する 2 つのロックを必要とし、そのいずれかが他方よりも強いわけではない場合 (特に、SHARE と ROW EXCLUSIVE)、SHARE ROW EXCLUSIVE など、両方を包含するロック・モードを検討してください。

表 1. ロック互換性マトリックス
  Access Share Row Share Row Exclusive 共有 Share Row Exclusive 排他的 Access Exclusive
Access Share 終了 終了 終了 終了 終了 終了 競合
Row Share 終了 終了 終了 終了 終了 競合 競合
Row Exclusive 終了 終了 終了 競合 競合 競合 競合
共有 終了 終了 競合 終了 競合 競合 競合
Share Row Exclusive 終了 終了 競合 競合 競合 競合 競合
排他的 終了 競合 競合 競合 競合 競合 競合
Access Exclusive 競合 競合 競合 競合 競合 競合 競合

構文

表をロックする場合の構文
LOCK TABLE <table> in <lockmode> MODE [NOWAIT]

入力

LOCK TABLE コマンドの入力は以下のとおりです。

表 2. LOCK TABLE の入力
入力 説明
<table> ロックする表の名前。
<lockmode> テーブルで獲得するロックのタイプ(表3参照)。 ロック・モードで単語 ROW が使用されていても、行レベル・ロックは暗黙指定されません。
NOWAIT 要求したロックをただちに獲得できない場合に、コマンドによってエラーが返され、トランザクションが打ち切られます。
テーブル3。 ロック・モード
ロック・モード 獲得を行うコマンド 必要な特権
ACCESS SHARE 選択 選択 これは最も弱いロック・モードです。 1 つの表に対して複数のトランザクションがこの種類のロックを保持できます。
ROW SHARE   Insert、Delete、または Update 1 つの表に対して複数のトランザクションがこの種類のロックを保持できます。
ROW EXCLUSIVE INSERT、DELETE、および UPDATE Insert、Delete、または Update 1 つの表に対して複数のトランザクションがこの種類のロックを保持できます。
SHARE CREATE MATERIALIZED VIEW と GENERATE STATISTICS Select または Genstats 1 つの表に対して複数のトランザクションがこの種類のロックを保持できます。
SHARE ROW EXCLUSIVE   Insert、Delete、または Update  
排他的   Insert、Delete、または Update  
ACCESS EXCLUSIVE DROP TABLE、ALTER TABLE、および TRUNCATE TABLE Drop、Alter、または Truncate  

出力

LOCK TABLE コマンドの出力は以下のとおりです。

テーブル4。 LOCK TABLE の出力
出力 説明
LOCK TABLE コマンドは成功します。
NOTICE: LOCK TABLE issued after query against user tables トランザクションがユーザー表に対する照会を発行した後に LOCK TABLE が発行された場合、システムにより NOTICE メッセージが表示され、コマンドは要求されたロックを獲得できるようになると成功します。

特権

管理者ユーザー、テーブルの所有者、テーブルが定義されているデータベースまたはスキーマの所有者、または表 3 で説明されている適切なオブジェクト権限を持っているアカウントでなければなりません。

使用法

以下に使用例を示します。
LOCK TABLE customers IN ROW EXCLUSIVE MODE;