テーブルをロックします。

構文

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 ロックするテーブルの名前。 名前はスキーマで修飾できます。

LOCKTABLE a, b コマンドは LOCK TABLE a; LOCK TABLE b と同じです。LOCK TABLE コマンド内で指定した順序で、1 つずつテーブルがロックされます。

lockmode 競合するロックを指定するロックモード。

ロックモードが指定されていない場合、サーバーにより最も制限が強い ACCESS EXCLUSIVE が使用されます。 ACCESS EXCLUSIVE は、Oracle データベースとは互換性がありません。 Oracle と互換性のある PolarDB データベースでは、このモードにより、いかなる方法でもロックされたテーブルに他のトランザクションがアクセスすることはできません。

NOWAIT LOCKTABLE コマンドが競合するロックがリリースされるまで待機しないように指定します。 指定したロックをすぐに取得できない場合、トランザクションは終了します。

注記

すべての形式の LOCK は、UPDATE および/または DELETE 権限を必要とします。

トランザクションが終了するとロックは解除されるため、LOCK TABLE はトランザクションブロック内でのみ役立ちます。 トランザクションブロック外で使用される LOCK TABLE コマンドは、自己完結型のトランザクションを形成するため、ロック取得時にそのロックは解除されます。

LOCK TABLE はテーブルレベルのロックのみを扱うため、名前に ROW が含まれるモードはすべて適切ではありません。 これらのモード名は、ロックされたテーブル内で行レベルのロックを取得できることを示すものとして読み取られます。 また、ROW EXCLUSIVE ロックは共有可能なテーブルロックです。 LOCK TABLE に関する場合は、すべてのロックモードのセマンティクスは同じであり、競合を確認するルールのみが異なります。