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操作についてデータの同時実行性が許可されます。
たとえば、CREATE
PROCEDURE
文の実行時には、その文を含むトランザクションは、参照されるすべての表について共有DDLロックを取得します。他のトランザクションは同じ表を参照するプロシージャを同時に作成できるため、同じ表について同時実行の共有DDLロックの取得はできますが、参照中の表について排他DDLロックを取得できるトランザクションはありません。
共有DDLロックは、DDL文実行の継続中と自動コミット中ずっと存続します。そのため、共有DDLロックを保持するトランザクションには、トランザクションの継続中は参照しているスキーマ・オブジェクトの定義が変更されないことが保証されます。