LOCK TABLE
目的
LOCK TABLE文を使用すると、1つ以上の表、表パーティションまたは表サブパーティションを特定のモードでロックできます。操作中の表またはビューに対する他のユーザーによるアクセスを許可または制限するため、自動ロックを手動で無効にします。
一部の形式のロックは、同じ表に同時に設定できます。それ以外のロックは、表ごとに1つしか設定できません。
ロックされた表は、トランザクションをコミットするか、全体をロールバックするか、または表をロックする前のセーブポイントにロールバックするまでロックされています。
ロックした場合でも他のユーザーが表を問い合せることができます。問合せによって表がロックされることはありません。読取りプログラムは書込みプログラムをブロックすることはなく、書込みプログラムが読取りプログラムをブロックすることもありません。
関連項目:
-
ロック・モードの相互作用については、『Oracle Database概要』を参照してください。
前提条件
表またはビューが自分のスキーマ内にある必要があります。自分のスキーマ内にない場合は、LOCK ANY TABLEシステム権限、または表やビューに対するオブジェクト権限(READオブジェクト権限を除く)が必要です。
構文
lock_table::=
partition_extension_clause::=
セマンティクス
schema
表またはビューが含まれているスキーマを指定します。schemaを指定しない場合、表またはビューは自分のスキーマにあるとみなされます。
table | view
ロックする表またはビューの名前を指定します。
viewを指定した場合、ビューの実表がロックされます。
partition_extension_clauseを指定した場合、Oracle Databaseでは最初にその表が暗黙的にロックされます。表ロックは、パーティションまたはサブパーティションに指定するロックと同じです。ただし、次の2つの例外があります。
-
SHAREロックをサブパーティションに指定した場合、表が暗黙的にROWSHAREロックされます。 -
EXCLUSIVEロックをサブパーティションに指定した場合、表が暗黙的にROWEXCLUSIVEロックされます。
PARTITIONを指定し、tableがコンポジット・パーティション化されている場合、パーティションのすべてのサブパーティションがロックされます。
表のロックの制限事項
表のロックには、次の制限事項が適用されます。
-
viewは、階層の一部の場合、階層のルートである必要があります。 -
ロックは、自動リスト・パーティション表の既存のパーティションに対してのみ適用できます。つまり、次の文を指定する場合、パーティション・キー値は、後でオンデマンドで作成できるパーティションに対応するパーティションではなく、表内にすでに存在するパーティションに対応している必要があります。
LOCK TABLE ... PARTITION FOR (partition_key_value) ...
dblink
表またはビューが格納されている、Oracle Databaseのリモート・データベースに対するデータベース・リンクを指定します。Oracle分散機能を使用している場合のみ、リモート・データベースで表およびビューをロックできます。LOCK TABLE文を使用してロックする表は、すべて同じデータベース上にある必要があります。
dblinkを指定しない場合、その表またはビューはローカル・データベース内にあるとみなされます。
関連項目:
データベース・リンクの指定方法の詳細は、「リモート・データベース内のオブジェクトの参照」を参照してください。
lockmode句
次のいずれかのモードを指定します。
ROW SHAREを指定すると、ロックされた表への同時アクセスは可能になりますが、排他アクセスのために表全体をロックできなくなります。ROW SHAREは、SHARE UPDATEと同じ意味で、以前のリリースのOracle Databaseとの互換性を保つために用意されています。
ROW EXCLUSIVEは、ROW SHAREと同じですが、SHAREモードでロックはできません。ROW EXCLUSIVEロックは、更新、挿入、削除の実行時に自動的に適用されます。
「ROW SHARE」を参照してください。
SHARE
SHAREを指定すると、同時問合せは実行可能ですが、ロックされた表は更新できなくなります。
SHARE ROW EXCLUSIVEは、表全体を見る場合に使用します。これを使用すると他のユーザーがその表内の行を見ることはできますが、SHAREモードで表のロックまたは行の更新を行うことはできません。
EXCLUSIVEを指定すると、ロックされた表上での問合せは実行可能ですが、他のアクティビティは実行できなくなります。
NOWAITを指定すると、指定した表、パーティションまたは表のサブパーティションが他のユーザーによってすでにロックされている場合に、制御をすぐに戻すことができます。この場合、表、パーティションまたはサブパーティションが他のユーザーによってロックされていることを示すエラー・メッセージが戻ります。
WAIT
WAIT句を使用すると、LOCK TABLE文では、DMLロックを取得するまでに指定した時間(秒数)待機するように指定できます。integerの値に制限はありません。
NOWAITもWAITも指定しない場合には、表が利用可能になり、ロックされ、制御が戻されるまで、データベースは無限に待機します。データベースでDML文と同時にDDL文が実行されている場合、タイムアウトまたはデッドロックが発生することがあります。このようなタイムアウトまたはデッドロックが検出されると、エラーが戻されます。
関連項目:
表のロックの詳細は、『Oracle Database管理者ガイド』を参照してください。
例
表のロック: 例
次の文は、employees表を排他モードでロックします。他のユーザーがすでに表をロックしている場合でも、待ち状態にはなりません。
LOCK TABLE employees IN EXCLUSIVE MODE NOWAIT;
次の文は、データベース・リンクremoteを介してアクセスできるリモート表employeesをロックします。
LOCK TABLE employees@remote IN SHARE MODE;

