オプティミスティック コンカレンシー例外について疑問があります。
たとえば、データベースからいくつかのデータを取得し、いくつかのレジスタを変更してから、変更を送信します。私の要求と私の更新の間に誰かがレジスタの情報を更新すると、楽観的な例外が発生します。古典的な並行性の問題。
私の最初の疑問は次のとおりです。EF は、情報が変更されているかどうかを判断し、データベースからデータを取得し、取得した元のデータとデータベースから取得したデータを比較します。違いがある場合は、オプティミスティック同時実行例外がスローされます。
オプティミスティック同時実行例外をキャッチした場合、クライアントが勝つかストアが勝つかを決定します。このステップで、EF は情報を再度取得するか、最初に取得したデータを使用しますか? 再度データを取得すると効率が悪いからです。
2 番目の疑問は、オプティミスティック同時実行例外を制御する方法です。コードの catch ブロックで、クライアントが勝つかストアが勝つかを決定します。クライアントが勝ったら、saveChanges を再度呼び出します。しかし、クライアントが勝ったと判断してから変更を保存するまでの間に、他のユーザーがデータを変更する可能性があるため、楽観的同時実行例外が再び発生します。理論的には、無限ループになる可能性があります。
クライアントがデータベース内の情報を確実に更新できるように、トランザクション (スコープ) を使用するのは良い考えでしょうか? 他の解決策は、ループを使用してデータを更新するために N 回試行することです。それが不可能な場合は、終了してユーザーに伝えます。
取引は良い考えでしょうか?データベースのリソースを大量に消費しますか? トランザクションはデータベースを一瞬ブロックしますが、更新操作が確実に終了するようにします。操作を完了しようとする N 回のループ、データベースを N 回呼び出すため、さらに多くのリソースが必要になる可能性があります。
ありがとう。ダイムロック。
編集:私は尋ねるのを忘れました。同時実行例外を待機する代わりに、デフォルトでクライアント wins を使用するようにコンテキストを設定することは可能ですか?