実行するジョブを含む SQL Server (2008 R2) にキューを実装しています。完了すると、ジョブは履歴テーブルに移動され、フラグが成功または失敗に設定されます。キュー テーブル内のアイテムには、主キーとして ID 列があります。履歴キューには、この ID とタイム スタンプの組み合わせが PK として含まれています。
ジョブが失敗した場合、それを再実行するオプションが欲しいのですが、これは、履歴テーブルから元に戻し、ライブ キューに戻すことだと考えられています。トレーサビリティの目的で、再挿入された行に元のエントリと同じ ID を持たせたいのですが、これは ID 列であるため問題が発生します。
考えられる解決策は 2 つあります。
1) IDENTITY_INSERT を使用します。
SET IDENTITY_INSERT TableName ON
-- Move from history to live queue
SET IDENTITY_INSERT TableName OFF
2) ライブ キューと履歴キューの両方から最大 ID 値を取得して追加するなど、一意の ID を生成するカスタム ロジックを作成します。
2 が面倒で、おそらくパフォーマンスが悪く、神経症の皮膚が這うようになることを除けば、2 には実際の問題は見られません...
オプション 1 は気に入っていますが、その意味が十分にわかりません。これはどのように機能しますか?そして、これを 2 つのテーブルに対して同時に行うと、物事がクラッシュしたり燃えたりすることを私は知っています。2 つのスレッドが同じテーブルに対して同時にこれを行うとどうなりますか?
これは、半一般的に使用されるストアド プロシージャに対してこれを行う良い方法ですか、それとも、ブルー ムーンで 1 回だけデータをバッチ挿入するためにこの手法を使用する必要がありますか?
どちらが最良の選択肢であるか、またはより良い方法があるかについて何か考えはありますか?