1

セットアップ: SQL Server 2008 R2

バック ストーリー: 一度に複数のスレッドで呼び出される proc があります。これらのスレッド化された proc 呼び出しは、書き込み先のテーブルに重複 (重複) データを書き込むことがあります。挿入ステートメントには、重複が挿入されないようにする「NOT EXISTS」句がありますが、まだ重複が発生しています。

質問: "NOT EXISTS" 句は単純な選択を行います。おそらく、スレッド化された呼び出しの挿入がミリ秒間隔で行われるため、一部のインデックス (特に "NOT EXISTS" 句で使用されるインデックス) が更新されない可能性があります。まだ?したがって、挿入を行う前に既存のレコードが表示されませんか?

考え: これは、SQLがどのように機能するかを理解していない可能性があります。「WHERE NOT EXISTS」を含む挿入がある場合、挿入を行う前にレコードが存在しないことを確認しますか? それとも、各行を挿入するときに行ごとにチェックしますか? 前者の場合(挿入を行う前にすべてをチェックする)、他の呼び出しの1つがまだ挿入を完了していない可能性があると思います。

私は困惑しています。

これが私がやっていることの例です:

INSERT INTO [SomeTable] (Col1,Col2)
選択する
    列A、
    列B
から
    #TempTable
どこ
    存在しません (
        選択 1
        FROM [一部のテーブル]
        WHERE Col1 = #TempTable.ColumnA
              AND Col2 = #TempTable.ColumnB
    )
4

2 に答える 2

0

トランザクションの間、テーブルをロックする必要があります。他のスレッドは、トランザクションが完了するまで待機します (コミットまたはロールバック)。

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

BEGIN TRANSACTION

--do stuff

COMMIT TRANSACTION

http://msdn.microsoft.com/en-us/library/ms173763.aspx

于 2013-06-06T16:24:38.647 に答える