IDENTITY フィールドを主キーとして使用して、キューに入れられた各アイテムに一意に増分する ID を提供し、それにクラスター化インデックスを貼り付けます。これは、アイテムがキューに入れられた順序を表します。
処理中にアイテムをキュー テーブルに保持するには、特定のアイテムの現在のステータスを示す「ステータス」フィールドが必要です (例:0 =待機中、1 =処理中、2 =処理中)。これは、アイテムが 2 回処理されるのを防ぐために必要です。
キュー内のアイテムを処理する場合、現在処理されていないテーブル内の次のアイテムを見つける必要があります。これは、以下に示すように、複数のプロセスが同じアイテムを同時に処理するのを防ぐような方法である必要があります。 表のヒント に注意してください キューを実装する際に注意すべき UPDLOCK と READPAST。
例えばsproc 内では、次のようになります:
DECLARE @NextID INTEGER BEGIN TRANSACTION -- Find the next queued item that is waiting to be processed SELECT TOP 1 @NextID = ID FROM MyQueueTable WITH (UPDLOCK, READPAST) WHERE StateField = 0 ORDER BY ID ASC -- if we've found one, mark it as being processed IF @NextId IS NOT NULL UPDATE MyQueueTable SET Status = 1 WHERE ID = @NextId COMMIT TRANSACTION -- If we've got an item from the queue, return to whatever is going to process it IF @NextId IS NOT NULL SELECT * FROM MyQueueTable WHERE ID = @NextID
プレ>アイテムの処理が失敗した場合、後で再試行できるようにしますか?その場合は、ステータスを 0 か何かにリセットする必要があります。それには、さらに検討が必要です。
あるいは、データベース テーブルをキューとして使用するのではなく、MSMQ のようなものを使用してください。