0

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 によって挿入された注文は返されません。しかし、これは実際の環境で起こっていることです。 !

なぜこれが起こっているのかについての洞察を持っている人はいますか?

4

2 に答える 2

0

問題は、トランザクションを開いていくつかの行を追加すると、トランザクションがコミットされるまでそれらの行がロックされることです。

ロックされた行を含む選択を実行する場合SELECT *、SELECT を許可する前に、トランザクションをコミットまたはロールバックしてロックを解除する必要があります。

于 2012-04-30T10:15:15.130 に答える
0

実験として、ジョブ 1 によって実行されたいくつかの作業をロールバックして、ロールバックが発生したときにトランザクションに含まれると思われるすべてのものが実際に削除されることを確認します。私は、あなたと同じように、READ COMMITTED を使用すると、ロールバックによって削除されるデータを別のトランザクションから読み取ることができないのではないかと疑っていたでしょう。行を読み取ることができるという事実は、それらの一部がトランザクションのコンテキストの外に出ている可能性があることを示唆しています。

私の次の考えは、READ COMMITTED の意味を確認することです。この分離レベルは、おそらく、読み取っているデータが 1 つのトランザクションによってコミットされたことを保証しますが、別のトランザクションの結果として変更できないことを必ずしも保証しません。これを、すべてのデータがトランザクションの終わりまでロックされたままになる REPEATABLE READ や、すべてのトランザクションが順番に実行されたかのように動作しようとする SERIALIZABLE とは対照的です。ロックを SERIALIZABLE (最も制限が厳しい) に変更すると、この特定の問題は発生しないと思いますが、それはやり過ぎかもしれません。

他の分離レベルと比較して READ COMMITTED の意味を検討した後、挿入した行は実際にはその行の最後にまだ存在する行であるため、この分離レベルで見ている動作は自然であると思います。取引。READ COMMITTED は、クエリが行の完全なセットを返すことを保証することを意図していないと思います (SERIALIZABLE によって課される範囲ロックが必要になります)。部分的な行を読み取っていません)。私は間違っているかもしれませんが、あなたが説明した行動を考えると、これは私の疑いです. 行のセット全体が完全であることを確認する必要がある場合は、SERIALIZABLE 分離が必要だと思います。

SERIALIZABLE にする必要があるのはどのトランザクションですか? 明らかに、両方ともSERIALIZABLEであれば、うまくいくはずです。ただし、そのうちの 1 つだけを SERIALIZABLE にしても、正しい動作が得られる可能性があります。現時点での私の精神力は、何が本当にシリアライズ可能である必要があるかを判断するタスクに達していませんが、おそらく他の人によるいくつかのコメントは、追加の光を当てるでしょう.

于 2010-02-24T12:29:20.473 に答える