プライマリ・コンテンツに移動
Oracle® Database SQL言語リファレンス
11gリリース2 (11.2)
B56299-08
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

DDL操作での自動ロック

実行中のDDL操作でスキーマ・オブジェクトが影響を受けたり参照される間、そのオブジェクトの定義はデータ・ディクショナリ(DDL)・ロックで保護されます。たとえば、ユーザーがプロシージャを作成すると、そのプロシージャ定義で参照されるすべてのスキーマ・オブジェクトのDDLロックが自動的に取得されます。DDLロックは、プロシージャのコンパイルが完了する前に、これらのオブジェクトが変更されたり削除されるのを防ぎます。

Oracle Databaseは、DDLロックを必要とするDDLトランザクションのために、DDLロックを自動的に取得します。ユーザーは明示的にDDLロックを要求できません。DDL操作中には、変更または参照される個々のスキーマ・オブジェクトのみがロックされます。データ・ディクショナリ全体がロックされることはありません。

DDL操作では、変更されるスキーマ・オブジェクトに対するDMLロックも取得されます。

排他DDLロック

排他DDLロックは、他のセッションにDDLロックまたはDMLロックが取得されないようにします。

ほとんどのDDL操作では、同じスキーマ・オブジェクトを変更または参照する可能性のある他のDDL操作によって破壊的な干渉が起きないように、排他DDLロックが必要です。たとえば、ALTER TABLE操作で表に列を追加している間は、DROP TABLE操作で表を削除できません。その逆も同様です。ただし、表に対する問合せはブロックされません。

排他DDLロックは、DDL文が実行されて自動的にコミットされるまで継続します。排他DDLロックの取得では、別の操作によってすでにスキーマ・オブジェクトに対する別のDDLロックが保持されている場合、その取得は古いDDLロックが解除されるまで待機し、その後に処理されます。

共有DDLロック

リソースの共有DDLロックを使用すると、競合するDDL操作による破壊的な干渉を防ぐことができ、かつ一方では類似のDDL操作についてデータの同時実行性が許可されます。

たとえば、CREATE PROCEDURE文の実行時には、その文を含むトランザクションは、参照するすべての表について共有DDLロックを取得します。他のトランザクションは、同じ表を参照するプロシージャを同時に作成し、同じ表に対する共有DDLロックを同時に取得できます。ただし、参照する表に対して排他DDLロックを取得できるトランザクションはありません。

共有DDLロックは、DDL文が実行されて自動的にコミットされるまで継続します。そのため、共有DDLロックを保持するトランザクションには、トランザクションの継続中は参照しているスキーマ・オブジェクトの定義が変更されないことが保証されます。

ブレーク可能解析ロック

SQL文またはPL/SQLプログラム・ユニットは、参照する各スキーマ・オブジェクトについて解析ロックを保持します。解析ロックを取得する目的は、参照しているオブジェクトが変更または削除された場合に、対応する共有SQL領域を無効にできるようにするためです。解析ロックは、どのようなDDL操作も拒否せず、矛盾するDDL操作も許可するためにブレーク(中断)できるため、ブレーク可能解析ロックと呼ばれます。

解析ロックは、SQL文の実行解析フェーズの間に、共有プール内で取得されます。このロックは、共有プールの中にその文の共有SQL領域が残っているかぎり保持されます。