sql >> データベース >  >> RDS >> Sqlserver

データベース テーブルをキューとして使用する

    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 のようなものを使用してください。

    1. Eloquentモデルで複雑な仮想列を作成するにはどうすればよいですか?

    2. IllegalStateException:データベースはすでに閉じられています(ViewPagerを使用)

    3. mySQLブロブ画像のプリントアウト?

    4. Android:SQLiteは文字列配列を保存しますか?