0

在庫管理をする必要があるので、製品の量を変更したときに、正しい方法で行われていることを確認する必要があります。EntityFramework4.0を使用しています

たとえば、トランザクションを使用する場合、データベースからレコードをロードすると、リコアがブロックされるため、必要なアイテムの数であるロードされた量を減算または加算できます。ただし、これはデータベース内のレコードをブロックし、おそらくパフォーマンス上の理由から、最善の方法ではありません。これにより、EFとのトランザクションをいつ使用するかを尋ねられます。

もう1つのオプションは、エンティティフレームワークの同時実行性を使用し、タイムスパン列を使用してレコードが変更されたかどうかを検出することです。この場合、ロードと更新の間にレコードが変更されていると、同時実行の例外が発生します。ただし、例外ハンドラーで、データベースデータを使用してコンテキストを更新すると、更新とsavechangesの間で再度変更される可能性があります。

もう1つの問題は、最終的に変更を保存できることです。たとえば、私は10ユニットを持っており、8を差し引く必要がありますが、ロードと更新の間に、他の人が5ユニットを差し引きます。8を引くと、在庫は-3ユニットになります。これは不可能です。トランザクションがある場合は、レコードをロードしてブロックされるため、十分なユニットがあるかどうかを確認できます。十分な数がある場合はサブトラックでき、ない場合は例外を送信します。

ですから、私の質問は、EFはそれ自体がトランザクションであることを知っていますが、EF内のトランザクションにも存在するため、場合によっては役立つでしょう。EFと共通貨をいつ使用するか、またいつトランザクションを使用するか。

ありがとう。ダイムロック。

4

1 に答える 1

1

同時実行性を解決するためにトランザクションを使用しないでください。データベースをブロックしないように、トランザクションはできるだけ短くする必要があります。ここに進む方法は、楽観的同時実行制御です。データベース(SqlServer)で、行が変更されるたびに自動的に変更される行バージョン列を作成します。並行性トークンとして使用します。変更を保存するとき、EFはこれをエンティティの値と照合し、一致しない場合は例外をスローします。SaveChangesの場合、EFは常にトランザクションを作成することに注意してください。通常、複数のエンティティを保存し、問題が発生した場合はデータベースを元の状態に戻す必要があります。そうしないと、データベースが破損した状態になります。ゼロを下回るのを防ぐために(楽観的並行性を使用する場合)、行が変更されたために同時実行トークンが異なるため、データベースの値が変更された場合は保存できません。したがって、クライアントでのチェックで十分です。または、エンティティの保存を、保存前に値をチェックし、保存後の値が正しくない場合にエラーを返すストアドプロシージャにマップすることもできます。

于 2012-11-07T01:33:08.050 に答える