LOCK TABLE コマンドは、現在のデータベース内の表をロックするために使用します。ロック・モードは獲得するロックのタイプを指定します。
LOCK TABLE コマンドは、表に対して指定されたモードのロックを獲得できたときに成功します。このコマンドでは、ロック獲得に必要な時間待機します。ただし、NOWAIT オプションを指定した場合、コマンドでロックをただちに獲得できないと、トランザクションは打ち切られます。
ロックはトランザクションがコミットされるか打ち切られるまで保持されます。LOCK TABLE が暗黙的に (つまり、BEGIN/COMMIT ペアではなく) 発行された場合、コマンドは許可された時点でロックを獲得し、その後ただちにロックを解放します。これはコマンドが、コマンド完了時に暗黙的にコミットするシングル・ステートメント・トランザクションであったためです。
可能な場合、トランザクション内のどの照会よりも前に、LOCK TABLE コマンドを発行する必要があります。 ユーザー表に対して照会を発行した後にロックを獲得しても、必ずしも逐次化エラーからトランザクションを保護することにはなりません。
トランザクション内で複数の表に対する LOCK TABLE コマンドを発行する計画をしている場合、アプリケーションが設定した順にコマンドを発行します。 これにより、デッドロックの可能性が最小化されます。デッドロックが発生した場合、Postgres はデッドロックに関与したいずれかのトランザクションを打ち切ります。
以下の表に、ロック競合のマトリックス、つまり、どのロックが、他のどのタイプのロックをブロックするかを示します。 別のトランザクションが同じ表に対する対立するロックを保持しているときに、トランザクションにロックを付与できなかった場合、ロック・モードは別のモードと競合しています。同じトランザクションが保持する複数のロックは、互いに競合しません。1 つのトランザクションで、同じ表に対して複数のモードのロックを保持できます。 同じ表に対する複数のロックを獲得する場合、デッドロックの可能性を最小化するため、より強いロックを最初に要求してください。 あるトランザクションが同じ表に対する 2 つのロックを必要とし、そのいずれかが他方よりも強いわけではない場合 (特に、SHARE と ROW EXCLUSIVE)、SHARE ROW EXCLUSIVE など、両方を包含するロック・モードを検討してください。
| Access Share | Row Share | Row Exclusive | Share | Share Row Exclusive | Exclusive | Access Exclusive | |
|---|---|---|---|---|---|---|---|
| Access Share | OK | OK | OK | OK | OK | OK | 競合 |
| Row Share | OK | OK | OK | OK | OK | 競合 | 競合 |
| Row Exclusive | OK | OK | OK | 競合 | 競合 | 競合 | 競合 |
| Share | OK | OK | 競合 | OK | 競合 | 競合 | 競合 |
| Share Row Exclusive | OK | OK | 競合 | 競合 | 競合 | 競合 | 競合 |
| Exclusive | OK | 競合 | 競合 | 競合 | 競合 | 競合 | 競合 |
| Access Exclusive | 競合 | 競合 | 競合 | 競合 | 競合 | 競合 | 競合 |
LOCK TABLE <table> in <lockmode> MODE [NOWAIT]
LOCK TABLE コマンドの入力は以下のとおりです。
| 入力 | 説明 |
|---|---|
| <table> | ロックする表の名前。 |
| <lockmode> | 表に対して獲得するロックのタイプ (表 3を参照)。 ロック・モードで単語 ROW が使用されていても、行レベル・ロックは暗黙指定されません。 |
| NOWAIT | 要求したロックをただちに獲得できない場合に、コマンドによってエラーが返され、トランザクションが打ち切られます。 |
| ロック・モード | 獲得を行うコマンド | 必要な特権 | 注意 |
|---|---|---|---|
| ACCESS SHARE | SELECT | Select | これは最も弱いロック・モードです。 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 | ||
| EXCLUSIVE | Insert、Delete、または Update | ||
| ACCESS EXCLUSIVE | DROP TABLE、ALTER TABLE、および TRUNCATE TABLE | Drop、Alter、または Truncate |
LOCK TABLE コマンドの出力は以下のとおりです。
| 出力 | 説明 |
|---|---|
| LOCK TABLE | コマンドは正常に実行されました。 |
| NOTICE: LOCK TABLE issued after query against user tables | トランザクションがユーザー表に対する照会を発行した後に LOCK TABLE が発行された場合、システムにより NOTICE メッセージが表示され、コマンドは要求されたロックを獲得できるようになると成功します。 |
admin ユーザー、表の所有者、またはこの表が定義されたデータベースかスキーマの所有者でなければなりません。あるいは、ご使用のアカウントに、表 3に示された適切なオブジェクト特権が付与されていなければなりません。
LOCK TABLE customers IN ROW EXCLUSIVE MODE;