実行中のDDL操作でスキーマ・オブジェクトが影響を受けたり参照される間、そのオブジェクトの定義はデータ・ディクショナリ(DDL)・ロックで保護されます。たとえば、ユーザーがプロシージャを作成すると、そのプロシージャ定義で参照されるすべてのスキーマ・オブジェクトのDDLロックが自動的に取得されます。DDLロックは、プロシージャのコンパイルが完了する前に、これらのオブジェクトが変更されたり削除されるのを防ぎます。
Oracle Databaseは、DDLロックを必要とするDDLトランザクションのために、DDLロックを自動的に取得します。ユーザーは明示的にDDLロックを要求できません。DDL操作中には、変更または参照される個々のスキーマ・オブジェクトのみがロックされます。データ・ディクショナリ全体がロックされることはありません。
DDL操作では、変更されるスキーマ・オブジェクトに対するDMLロックも取得されます。
排他DDLロックは、他のセッションにDDLロックまたはDMLロックが取得されないようにします。
ほとんどのDDL操作では、同じスキーマ・オブジェクトを変更または参照する可能性のある他のDDL操作によって破壊的な干渉が起きないように、排他DDLロックが必要です。たとえば、ALTER TABLE
操作で表に列を追加している間は、DROP TABLE
操作で表を削除できません。その逆も同様です。ただし、表に対する問合せはブロックされません。
排他DDLロックは、DDL文が実行されて自動的にコミットされるまで継続します。排他DDLロックの取得では、別の操作によってすでにスキーマ・オブジェクトに対する別のDDLロックが保持されている場合、その取得は古いDDLロックが解除されるまで待機し、その後に処理されます。
リソースの共有DDLロックを使用すると、競合するDDL操作による破壊的な干渉を防ぐことができ、かつ一方では類似のDDL操作についてデータの同時実行性が許可されます。
たとえば、CREATE
PROCEDURE
文の実行時には、その文を含むトランザクションは、参照するすべての表について共有DDLロックを取得します。他のトランザクションは、同じ表を参照するプロシージャを同時に作成し、同じ表に対する共有DDLロックを同時に取得できます。ただし、参照する表に対して排他DDLロックを取得できるトランザクションはありません。
共有DDLロックは、DDL文が実行されて自動的にコミットされるまで継続します。そのため、共有DDLロックを保持するトランザクションには、トランザクションの継続中は参照しているスキーマ・オブジェクトの定義が変更されないことが保証されます。
SQL文またはPL/SQLプログラム・ユニットは、参照する各スキーマ・オブジェクトについて解析ロックを保持します。解析ロックを取得する目的は、参照しているオブジェクトが変更または削除された場合に、対応する共有SQL領域を無効にできるようにするためです。解析ロックは、どのようなDDL操作も拒否せず、矛盾するDDL操作も許可するためにブレーク(中断)できるため、ブレーク可能解析ロックと呼ばれます。
解析ロックは、SQL文の実行解析フェーズの間に、共有プール内で取得されます。このロックは、共有プールの中にその文の共有SQL領域が残っているかぎり保持されます。