これはばかげた質問かもしれませんが、これらのストアド プロシージャの作成方法が問題を引き起こす可能性があるかどうかはよくわかりません。
私のselectストアドプロシージャは次のようになります:
ALTER PROCEDURE [dbo].[GetSRPsToProcess]
@CurrentTime DateTime
AS
BEGIN
BEGIN TRAN Tran1
Select TOP 20 *
From SRPQueue WITH (updlock, ROWLOCK, readpast)
WHERE SRPQueue.TimeToDequeue <= @CurrentTime AND SRPQueue.Status = 'Pending'
ORDER BY SRPQueue_Index
COMMIT
END
私の削除手順は次のようになります (最終的にはログ テーブルへの挿入も含まれます)。
ALTER PROCEDURE [dbo].[DequeueRelevantSRPs]
-- Add the parameters for the stored procedure here
@SRPQueue_Index int,
-- @TimeDeleted datetime
AS
BEGIN
BEGIN TRAN Tran1
Delete
FROM SRPQueue
WHERE SRPQueue.SRPQueue_Index = @SRPQueue_Index
COMMIT
END
DequeueRelevantSRPs ストアド プロシージャが既に選択され、ロックされている行を削除しようとする (そして失敗する) という問題を回避するためのベスト プラクティスは、SRPQueue.Status 変数を使用することでしょうか?
いくつかの異なるステータス (保留中、処理中、準備完了、失敗) を持つことができ、追加の AND SRPQueue.Status = 'Ready' チェックが必要なだけなので、これは素晴らしいことです。潜在的なロックにもかかわらず、削除が成功することを確認できる別の方法はありますか?
編集: これらのストアド プロシージャを呼び出すアプリケーションは、複数のサーバー上の複数のインスタンスで実行されます。ちょっと重要な詳細>.>.