C# システムが、SQL (SQL2k5) では真相を解明できない奇妙な現象を引き起こしています。
状況は、同じテーブルを参照して同時に実行されている 2 つの別個のプロセスがあり、両方が 2 つの異なるクラスター上の 2 つの異なるサービス COM+ コンポーネントで独自のトランザクション内で実行されているということです。どちらもSQL テーブルOrder
と通信しています。OrderItem
どちらもREAD COMMITTED
分離レベルで実行されています。
ジョブ 1: 注文と 1 つ以上のアイテムをこれらのテーブルにロードします。
ジョブ 2: 完全に処理されたすべての注文を見つけて、上記のテーブルから選択する数分ごとに発生するスケジュールされたタスク。
問題:私たちが発見したことは、ジョブ 1 が完全に完了する前に、過去 8 か月間に 4 回、ジョブ 2 がジョブ 1 からの部分的にロードされた注文に反応したことです (注文のアイテムは在庫がないため、在庫がありません)。終了ステータスであるため、注文の残りの部分がまだロードされていないため、ジョブによって表示されます)。
調査によると、ジョブ 1 の進行中は次のことを行うことができません。
注文から*を選択
注文が挿入されたら。ただし、次のことができます。
select * fromOrder o 内部結合 OrderItem oi on oi.orderid = o.id
同時に(これはなぜですか?)。
同じ状況を再現する調査では、ジョブ 1 から部分的に作成された注文をジョブ 2 で確認することはできません。いくつかの行は返されますが、ジョブ 1 によって挿入された注文は返されません。しかし、これは実際の環境で起こっていることです。 !
なぜこれが起こっているのかについての洞察を持っている人はいますか?