私はHOLDLOCK
間違った使い方をしていると思います。
これは、キューのように機能するテーブルがあるためだと思います。キューは、以下の SQL から項目を受け取り、コンソール アプリケーションで 1 つずつ処理されます。まだテストしていませんが、このコンソール アプリケーションがこのテーブルの処理を開始すると、いくつかの長い選択中に以下のコードが失敗すると思います。なぜだと思いますか... テーブル キューからすべてを取得し、そのコンソール アプリケーションで 1 つずつ処理するときに、GameID をログに記録しているためです。面白いことに、ログに記録されなかったと思われるゲームが、キュー テーブルに挿入されているとは思えず、それはHOLDLOCK
以下の理由によるものだと思います。
考え?
MERGE Test WITH (HOLDLOCK) AS GL
USING (SELECT @GameId AS ID) AS NewTest ON GL.ID = NewTest.ID
WHEN NOT MATCHED THEN
INSERT
(
Id,
FailedAttempts,
DateCreated
)
VALUES
(
NewTest.ID,
0,
SYSDATETIME()
);