1

ストアドプロシージャ内に次のスクリプトがあります

IF EXISTS(SELECT * FROM dbo.MBLPosition WHERE PositionGKey = @i_PositionGKey) RETURN

-- DO SOME STUFF HERE

INSERT dbo.MBLPosition..

テーブル (単一レコード) にデータを挿入しています。まず、既に存在するかどうかを確認してから、何らかの処理を行ってレコードを挿入します。

処理には時間がかかる場合があります。たとえば、2 秒ほどかかります。その後に電話がかかってきて、制約例外が発生することがあります。まれですが、起こります。これを回避したいと同時に、レコードが既に存在する場合はこの処理を実行したくありません。余分な作業をせずに例外を回避できるように、このコードを構成する最善の方法は何ですか?

これは、常に入ってくるレコードを含む大きなテーブルです。重複が入ってきて処理時間があまりかからないため、重複を除外する最善の方法は何ですか?

4

2 に答える 2

6

1 つの方法は、チェックを実行することです。その後、いつでも try/catch を使用して挿入を試みることができます。@MitchWheatが指摘したように、適切なトランザクション処理を使用してこれを排除できます。

IF NOT EXISTS
(
  SELECT 1 FROM dbo.MBLPosition 
  WHERE PositionGKey = @i_PositionGKey
)
BEGIN
  BEGIN TRY
    -- do some stuff here
    INSERT dbo.MBLPosition..
  END TRY
  BEGIN CATCH 
    PRINT 'Not an exception, but insert failed';
  END CATCH
END

ここで同様のトピックを扱いました:

于 2012-06-12T02:17:13.967 に答える
3

テストとその後のアトミックを行うには、(十分な分離レベルの)トランザクションを使用する必要があります。INSERT

デッドロックが発生した場合は、スナップショット分離を有効にすることをお勧めします (2 秒はかなり長いように見えますが、処理に時間がかかる場合があります...)。

于 2012-06-12T02:17:07.060 に答える