0

私は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()
);
4

1 に答える 1