4

Snapshot Isolation を使用して MERGE 経由で複数の挿入を実行する SPROC があります。この SPROC は非常に高い負荷で呼び出され、多くの場合並列で呼び出されるため、変更の競合のためにスナップショットがロールバックされたことを示すエラー 3960 がスローされることがあります。これは、同時実行性が高いためです。

問題

後でこの作業を実行するために「再試行」キューを実装しましたが、エラーを再現してチェックが正確であることを確認するのは困難です。

質問

スナップショットの失敗 (具体的には 3960) を再現して、再試行ロジックが機能していることを確認するにはどうすればよいですか?

すでに試した

  • RAISEERROR は、既存のエラーを発生させることができず、ユーザー定義のエラーのみを発生させることができないため、機能しません
  • 同じレコードを再挿入しようとしましたが、2 つの異なるトランザクションが別のトランザクションを「競合」させているわけではないため、これは同じ失敗をスローしません。
4

2 に答える 2

1

2 つの接続を開き、両方でスナップショット トランザクションを開始し、接続 1 でレコードを更新し、接続 2 で同じレコードを更新し (ブロックされるためバックグラウンドで)、接続 1 でコミットします。

または、ユーザー エラーを 3960 ... として扱います。

于 2012-07-14T09:21:29.357 に答える
0

なぜこれをしないのですか:

RAISERROR(3960, {sev}, {state})

{sev} と {state} を本番環境でエラーが発生したときに表示される実際の値に置き換えますか?

(いいえ、マーティンが指摘したように、それはうまくいきません。)


そうでない場合は、テスト クエリを同時に複数回実行することをお勧めします。私はこれを自分で行って、他の同時実行エラーをシミュレートしました。テスト クエリが速すぎない限り (少なくとも数秒)、実行できるはずです。

于 2012-04-10T17:01:26.293 に答える