ストアド プロシージャを介して複数の注文プロセッサからアクセスされる注文キューがあります。各プロセッサは、独自の使用のために次の 20 の注文をロックするために使用される一意の ID を渡します。次にストアド プロシージャは、これらのレコードを注文プロセッサに返し、処理を行います。
複数のプロセッサが同じ「OrderTable」レコードを取得でき、その時点で同時に操作を試みる場合があります。これにより、最終的にはプロセスの後半でエラーがスローされます。
私の次の行動方針は、各プロセッサが利用可能なすべての注文を取得し、プロセッサをラウンドロビンすることですが、コードのこのセクションをスレッドセーフにして、プロセッサがいつでもレコードを取得できるようにすることを望んでいました.
明示的に-この競合状態が発生している理由と、問題を解決する方法を教えてください。
BEGIN TRAN
UPDATE OrderTable WITH ( ROWLOCK )
SET ProcessorID = @PROCID
WHERE OrderID IN ( SELECT TOP ( 20 )
OrderID
FROM OrderTable WITH ( ROWLOCK )
WHERE ProcessorID = 0)
COMMIT TRAN
SELECT OrderID, ProcessorID, etc...
FROM OrderTable
WHERE ProcessorID = @PROCID