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
ロックをサブパーティションに指定した場合、表が暗黙的にROW
SHARE
ロックされます。 -
EXCLUSIVE
ロックをサブパーティションに指定した場合、表が暗黙的にROW
EXCLUSIVE
ロックされます。
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;