0

私のアプリケーションには、ISA の例外を表示するために使用される「Daily Exception Report」というレポートがあります。このテーブルには、重複したエントリ (レポート内のまったく同じ 2 つの行) が表示されます。

技術的な詳細。

例外レポートは、エントリが重複しているtable呼び出しで使用可能なデータとともに表示されます。ExceptionFirstReportedへの行にInsert Statement使用されるは にあります。insertExceptionFirstReportedstored procedure usp_Refresh_Daily_Exception_Report

INSERT INTO ExceptionFirstReported(
       InvestorReference, ExceptionReason, First_Reported_Date, RelativeRef)
  SELECT InvestorReference, ExceptionReason, Dateupdated, RelatedInvRef FROM (
      SELECT * FROM DailyExceptionReport As DER
               WHERE NOT EXISTS
                 (SELECT ExcepRptd.InvestorReference
                  FROM ExceptionFirstReported AS ExcepRptd
                  WHERE DER.InvestorReference = ExcepRptd.InvestorReference
                  AND DER.ExceptionReason = ExcepRptd.ExceptionReason
                  AND DER.RelatedInvRef = ExcepRptd.RelativeRef))
  AS CI
  JOIN currentISAs AN CI.InvestorReference = Status_Inv_Ref

同一InvestorReferenceの ,ExceptionReasonと `RelatedInvRef.

ただし、エントリが重複しています。これは、insertに行を挿入するために使用される唯一のステートメントtableです。また、テーブルDailyExceptionReportcurrentISAsは以前に重複が含まれていませんでした。

上記の挿入クエリはストア プロシージャ 'usp_refresh_dailyreport' で呼び出され、SP はサイクルで 1 回だけ実行されました。

@returnvalue = Exec usp_refresh_dailyreport

@ 戻り値 = 1 の場合

それから

InvestorReference ExceptionReason First_reported_dt
Recent_reported_dt relativeref report_gen_date

442643169642 ゼロ残高 2012-04-11 09:54:00
2012-05-04 23:58:00 NULL

442643169642 > 1 つの ISA 2012-04-21 06:30:00 2012-04-23 23:58:00 452750423823 NULL

442643169642 > 1 つの ISA 2012-04-21 06:30:00
2012-04-23 23:58:00 452750423823 NULL

「ExceptionFirstReported」テーブルの上記のデータの最後の 2 行は同一であり、同じ相対参照 (null ではない) が含まれています。「relativeref」はnullフィールドではありませんが、最初の行のように空白のデータを保持する可能性があります。

4

1 に答える 1

1

この挿入を複数のスレッドで同時に実行していますか? 2 つのスレッドは、存在チェックを実行し、何も検出せず、同じデータに対して挿入を実行できます。

重複レコードを挿入していないことを 100% 確実にするために、一意のインデックスを追加することをお勧めします。破損したデータよりも (実用的な) 例外を設定することをお勧めします。

これは、ステートメントをトランザクション分離レベルでシリアライズ可能にすることで修正できます。

于 2012-05-03T17:42:12.960 に答える