私は現在、挿入の一部として使用されるファンキーな英数字コードを生成するカスタム定義関数を Oracle 10g で実行する INSERT TRIGGER を持っています。
関数 (またはトリガー) がスレッドセーフであることを確認して、2 人のユーザーが同時にトリガーをアクティブにした場合、トリガー内で使用される関数が両方のユーザーに対して同じコードを返さないようにする必要があります。
トリガーのフローは次のとおりです。
始める
- ビジネス ロジックに基づいて続行する必要があるかどうかを判断する
- カスタム関数を実行して新しいコードを取得する
- 返されたコードを別のテーブルへの挿入として使用する
終わり
主な問題は、ステップ 2 の実行中に別のスレッドがトリガーを起動し、これもステップ 2 に入り、最初のスレッドと同じコードを返す場合です。(これが非常に厳しい状況であることは理解していますが、対処する必要があります)。
これを行う主な方法として、次の 2 つを考えました。
私がこれまでに考えた最善の方法は、トリガーの開始時にトリガーで使用されるテーブルを「排他モード」でロックし、ロックの NOWAIT 属性を指定しないことです。このようにして、その後のトリガーのアクティブ化は、ロックが使用可能になるのを一種の「停止して待機」し、他のスレッドがトリガーで終了するのを待ちます。
テーブルの読み取りを拒否するテーブルをロックしたいのですが、Oracleでこれを行う方法を見つけたようです。
私のアイデアは理想的ではありませんが、うまくいくはずですが、これについてより良いアイデアを持っている人から聞いてみたいです!
与えられた助けに感謝します。
乾杯、マーク