特定のインサートへのアクセスを同期させたいのですが。したがって、複数のアプリケーションがこの「1つの」挿入を実行する場合、挿入は一度に1つずつ実行する必要があります。同期の背後にある理由は、このエンティティのインスタンスは1つだけである必要があるためです。複数のアプリケーションが同じエンティティを挿入しようとすると、1つだけが成功し、他のアプリケーションは失敗するはずです。検討された1つのオプションは、エンティティを一意に識別し、一意の制約に依存する複合一意キーを作成することでした。いくつかの理由で、dba部門はこのアイデアを拒否しました。私の頭に浮かんだ他のオプションは、挿入用のストアドプロシージャを作成することでした。ストアドプロシージャがグローバルロックを取得できる場合は、複数のアプリケーションが同じストアドプロシージャを呼び出しますが、別々のデータベースセッションでは ストアドプロシージャはグローバルロックを取得できるため、挿入をシリアル化できることが期待されます。私の質問は、Oracleバージョン10/11のストアドプロシージャでそのようなロックを取得することが可能であり、ドキュメントへのポインタが役立つことです。
1 に答える
1
挿入されたエンティティを一意にする場合、Oracle では何もシリアル化する必要はありません。一意の制約は完全に設計されており、まさにこの目的に適しています。Oracle は、1 つのエンティティのみが挿入されるようにするために必要なすべてのロックを処理します。
DBA 部門が一意の制約のアイデアを拒否した理由は思いつきません。これは非常に基本的なものです。おそらく、提案されたソリューションの他の側面を拒否したのでしょう。
なんらかの理由でアクセスをシリアライズしたい場合 (その理由が思いつきません)、(a) テーブル全体をロックして、テーブルのすべての DML をシリアライズすることができます。または (b) DBMS_LOCK を使用してユーザー名のロックを取得します。これは、ロックを取得する特定のプロセスのみをシリアル化します。どちらのオプションにも長所と短所があります。
于 2010-03-29T03:41:20.320 に答える