44

ストアド プロシージャを介して複数の注文プロセッサからアクセスされる注文キューがあります。各プロセッサは、独自の使用のために次の 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
4

2 に答える 2

6

Service Broker を使用できます。また、sp_getapplock を使用して行へのアクセスをシリアル化することもできます。これにより、競合状態が解消されます。

「独自のロック (SQL のミューテックス) を作成して同時実行を支援する」 http://sqlblogcasts.com/blogs/tonyrogerson/archive/2006/06/30/855.aspx

于 2009-06-02T15:21:45.280 に答える