これには説明が必要です。私が行ったことは、SQL Server 2005 で特定のカスタム メッセージ キューを作成することです。確認と完了の両方のタイムスタンプを含むメッセージを含むテーブルがあります。呼び出し元がキュー内の次のメッセージを取得するために実行するストアド プロシージャも、メッセージを確認します。ここまでは順調ですね。システムで大量のトランザクション (1 分間に数千件) が発生している場合、ストアド プロシージャの別の実行によってメッセージが確認応答される可能性はありませんか。ストアド プロシージャ内の SQL コードを表示してお手伝いします。
--Grab the next message id
declare @MessageId uniqueidentifier
set @MessageId = (select top(1) ActionMessageId from UnacknowledgedDemands);
--Acknowledge the message
update ActionMessages
set AcknowledgedTime = getdate()
where ActionMessageId = @MessageId
--Select the entire message
...
...
上記のコードでは、同時に実行されている別のストアド プロシージャが同じ ID を取得し、同時にそれを確認しようとすることはできませんでしたか? 別のストアド プロシージャがクエリしているメッセージを別のストアド プロシージャが確認できないようにするために、ある種のロックを実装できますか (または実装する必要がありますか)。
うわー、これは意味がありましたか?言葉にするのはちょっと難しい…