このデータのいくつかの集計を事前に計算するために、テーブル内のデータが変更された後に実行されるコストのかかるストアドプロシージャがあります。(SPは、関連する場合、テーブルのトリガーではなくアプリケーションによって呼び出されますが、これは難しい要件ではありません)。ストアドプロシージャは、ほぼ完全にINSERT INTO ... SELECT
ステートメントです。
データは通常、頻繁に変更されません(つまり、SPの呼び出しは頻繁ではありません)が、原則として重複する可能性があります。この場合の一貫性を確保するsp_getapplock
ために、2番目の呼び出しが最初の呼び出しが完了するのを待ってから続行するように使用します。
これは機能しますが、待機は非効率的で不要です。ストアドプロシージャが最初に行うことは、既存の(現在は古くなっている)データをすべて削除することです。私が本当に望んでいるのは、2回目の呼び出しで、最初の呼び出しに「あなたがしていることをわざわざ続けないでください。状況が変わったので、実行を停止して、正しい状態のままにしておきます」と伝えることです。
この場合、2番目の呼び出しで最初のSP呼び出しを確実に中止するための確実な方法はありますか?