テーブルをロックします。
構文
LOCK TABLE name [, ...] IN lockmode MODE [ NOWAIT ]
lockmode
は、次の項目のいずれかです。
ROW SHARE | ROW EXCLUSIVE | SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE
説明
LOCK TABLE
コマンドを使用して、テーブルレベルのロックを取得できます。 競合するロックが存在する場合、デフォルトでは競合するロックがすべて解放されるまで待機してから、テーブルがロックされます。
NOWAIT
を指定すると、 LOCK TABLE
コマンドは解放を待たずに対象のロックを取得します。 すぐにロックを取得できない場合、コマンドは終了し、エラーが発生します。 ロックを取得すると、現在のトランザクションが終了するまでロックが維持されます。
UNLOCK TABLE
コマンドは使用できません。 トランザクションが終了するまで、テーブルはロックを維持します。
テーブルを参照するコマンドのために自動ロックを取得する場合、Oracle と互換性のある PolarDB データベースでは、可能な限り最も制限の少ないロックモードが使用されます。
LOCK TABLE
は、より制限の強いロックが必要な場合に提供されます。 たとえば、アプリケーションが 読み取りのコミット の分離レベルでトランザクションを実行し、トランザクション中はテーブル内のデータの安定性が確保される必要があるとします。
これを実現するには、照会前に SHARE
モードでテーブルをロックします。 これにより、データの同時変更が防止され、後続のテーブルの読み取りのためにコミットされたデータの安定したビューが保証されます。 なぜなら
SHARE
ロックモードは書き込み側が取得する ROW EXCLUSIVE
ロックと競合するためです。 IN SHARE MODE
文の LOCK TABLE
名は、ROW EXCLUSIVE
のコンカレントホルダーがコミットまたはロールバックされるのを待ちます。 したがって、ロックの取得後に、コミットされていない書き込みは存在しません。 また、ロックを解除するまで、テーブルに対する操作は実行できません。
直列化可能な分離レベルでのトランザクション実行時に同様の効果を得るには、データ変更文を実行する前に LOCK TABLE
文を実行する必要があります。 最初のデータ変更文の開始後に、データの直列化可能なトランザクションビューは固定されます。 後から LOCK TABLE
を実行した場合も同時書き込みを防止できますが、トランザクションが読み取る値は、最後にコミットされた値と異なる場合があります。
直列化可能なトランザクションでテーブル内のデータを変更する場合は、SHARE
モードではなく、SHARE ROW EXCLUSIVE
モードでテーブルをロックする必要があります。
これにより、同じタイプのトランザクションが同時に複数実行されることがなくなります。 そうしないと、デッドロックが発生する可能性があります。 SHARE
モードでは、2 つのトランザクションが同時にテーブルをロックする可能性があり、ROWEXCLUSIVE
モードではどちらもロックを取得できず、更新を実行することができません。 トランザクション内でロックが競合することはないため、SHARE
モードを保持している場合、トランザクションは ROW EXCLUSIVE
モードでテーブルをロックすることができます。 ただし、別のトランザクションが SHARE ロックを保持している場合は、ROW EXCLUSIVE
ロックを取得できません。 デッドロックを回避するには、すべてのトランザクションで同じオブジェクトに対して同じ順序でロックを取得するようにします。 単一のオブジェクトが複数のロックモードを許可する場合、トランザクションは最初に最も制限が強いモードを取得する必要があります。
パラメーター
パラメーター | パラメーター |
---|---|
name | ロックするテーブルの名前。 名前はスキーマで修飾できます。
|
lockmode | 競合するロックを指定するロックモード。
ロックモードが指定されていない場合、サーバーにより最も制限が強い |
NOWAIT | LOCKTABLE コマンドが競合するロックがリリースされるまで待機しないように指定します。 指定したロックをすぐに取得できない場合、トランザクションは終了します。
|
注記
すべての形式の LOCK
は、UPDATE
および/または DELETE
権限を必要とします。
トランザクションが終了するとロックは解除されるため、LOCK TABLE
はトランザクションブロック内でのみ役立ちます。 トランザクションブロック外で使用される LOCK TABLE
コマンドは、自己完結型のトランザクションを形成するため、ロック取得時にそのロックは解除されます。
LOCK TABLE
はテーブルレベルのロックのみを扱うため、名前に ROW
が含まれるモードはすべて適切ではありません。 これらのモード名は、ロックされたテーブル内で行レベルのロックを取得できることを示すものとして読み取られます。 また、ROW EXCLUSIVE
ロックは共有可能なテーブルロックです。 LOCK TABLE
に関する場合は、すべてのロックモードのセマンティクスは同じであり、競合を確認するルールのみが異なります。