ストアドプロシージャがあり、同時に実行できないようにしたいと思います。
私の(マルチスレッド)アプリケーションは、このストアドプロシージャを介して、基になるテーブルに対して必要なすべての作業を実行します。
IMO、テーブル自体をロックすることは、実行する必要のある不必要に抜本的なアクションです。したがって、sp_GetAppLock
本質的にクリティカルセクションを強制する、について知ったとき、これは理想的に聞こえました。
私の計画は、ストアドプロシージャをトランザクションに含め、spGetAppLock
トランザクションスコープを設定することでした。コードは正常に記述され、テストされました。
コードはレビューのために提出され、この関数を呼び出すべきではないと言われました。しかし、「なぜだめなのか」という明白な質問をするとき、私が得ている唯一の理由は非常に主観的であり、あらゆる形式のロックが複雑であることに関係しています。
私は必ずしもこれを購入するわけではありませんが、この構成を避けるべきであるという客観的な理由があるのではないかと思っていました。私が言うように、私の状況を考えると、クリティカルセクションは私にとって理想的なアプローチに聞こえます。
詳細情報:アプリケーションは、2つのスレッドT1とT2でこの上に配置されます。各スレッドは、異なるメッセージM1とM2を待機しています。関連するビジネスロジックでは、処理はM1とM2の両方が到着した後にのみ発生する可能性があるとされています。ストアドプロシージャは、Mxが到着したことをログに記録し(挿入)、Myが存在するかどうかを確認します(選択)。組み込みのロックは、挿入が連続して行われることを確認するために問題ありません。しかし、選択も連続して行う必要があり、ここに組み込まれている機能に加えて何かを行う必要があると思います。
わかりやすくするために、「処理」を1回だけ実行する必要があります。したがって、ストアドプロシージャが誤検知または誤検知のいずれかを返す余裕はありません。ストアドプロシージャが非常にすばやく連続して2回実行されると、両方の「選択」が処理を実行するのが適切であることを示すデータを返す可能性があるのではないかと心配しています。