MS Sql Server2008R2に単純なキューの実装があります。キューの本質は次のとおりです。
CREATE TABLE ToBeProcessed
(
Id BIGINT IDENTITY(1,1) PRIMARY KEY NOT NULL,
[Priority] INT DEFAULT(100) NOT NULL,
IsBeingProcessed BIT default (0) NOT NULL,
SomeData nvarchar(MAX) NOT null
)
優先度とIsBeingProcessedがfalseであるIDの順に上位n行をアトミックに選択し、それらの行を更新して処理中であることを示します。Update、Top、Output、Order Byを組み合わせて使用すると思いましたが、残念ながら、Updateステートメントでtopとorderbyを使用することはできません。
そこで、更新を制限するin句を作成し、そのサブクエリが順序を実行します(以下を参照)。私の質問は、このステートメント全体がアトミックなのか、それともトランザクションでラップする必要があるのかということです。
DECLARE @numberToProcess INT = 2
CREATE TABLE #IdsToProcess
(
Id BIGINT NOT null
)
UPDATE
ToBeProcessed
SET
ToBeProcessed.IsBeingProcessed = 1
OUTPUT
INSERTED.Id
INTO
#IdsToProcess
WHERE
ToBeProcessed.Id IN
(
SELECT TOP(@numberToProcess)
ToBeProcessed.Id
FROM
ToBeProcessed
WHERE
ToBeProcessed.IsBeingProcessed = 0
ORDER BY
ToBeProcessed.Id,
ToBeProcessed.Priority DESC)
SELECT
*
FROM
#IdsToProcess
DROP TABLE #IdsToProcess
ダミー行を挿入するためのSQLを次に示します。
INSERT INTO ToBeProcessed (SomeData) VALUES (N'');
INSERT INTO ToBeProcessed (SomeData) VALUES (N'');
INSERT INTO ToBeProcessed (SomeData) VALUES (N'');
INSERT INTO ToBeProcessed (SomeData) VALUES (N'');
INSERT INTO ToBeProcessed (SomeData) VALUES (N'');