4

ユーザーがエンティティの特定のプロパティを設定できるようにする UI スレッドがあります。

また、重要なことに、ユーザーがアクセスできないエンティティのプロパティを自動的に変更するワーカー スレッドもあります。

DbContextsスレッドごとに異なるものを使用し、同じプロパティを常に変更しないようにプログラミングに依存してからSaveChanges()、同じエンティティが異なる方法で変更されたコンテキストで試行することは安全でしょうか?

または、これを行うためのより安全な方法、つまり、同じプロパティが 2 つの異なるコンテキストから安全に変更されるようにプログラマーがいつかコードを変更できるようにする方法はありますか? それとも、この後者の状況は、単にプログラマーが注意/リファクタリングをしなければならない状況ですか?

4

1 に答える 1

2

理論上の部分

マルチスレッド環境での同時実行の問題を解決するには、次の 3 つの方法があります。

  • 悲観的、これは編集中のアイテムに対して簡単に実行できますlocks-他の誰もが既に編集中のアイテムを編集することはできません。これは実装が非常に難しく、この方法はパフォーマンスの観点から非常に悪いです。すべての編集スレッドが単一のライターを待っているため、システム リソースが浪費されています。
  • 楽観的、これは問題を解決するデフォルトの方法です。主なアイデアは、成功するまで操作を続けることです。すでに紹介されているアルゴリズムはたくさんあります。ウィキの記事全体を読むことをお勧めします。また、テーマに関する追加の参考文献や本を読むことをお勧めします。
  • 一部lockの操作が必要な場合に使用されますが、すべてではありません。

練習パート

エンティティ フレームワークの作成者は、アプリで楽観的な方法を使用することをお勧めします。単純な使用例RowVersionは、または類似の名前のプロパティをモデルに追加DBUpdatedExceptionし、UPDATE.

Code-First次のように、ソリューションを使用できます。

[Timestamp]
public byte[] RowVersion { get; set; }

またはDatabase-First解決策(データベースエディタで列を追加):

ここに画像の説明を入力

その後、単純なケースのコードは次のようになります。

using (var context = new SchoolDBEntities())
{
    try
    {
        context.Entry(student1WithUser2).State = EntityState.Modified;
        context.SaveChanges();
    }
    catch (DbUpdateConcurrencyException ex)
    {
        Console.WriteLine("Optimistic Concurrency exception occured");
    }
}

私が理解しているように、データ ソースのいくつかのプロパティを調べる必要があるため、そのようなユース ケースに関する優れた記事を読むことをお勧めします(これは MVC アプリケーションに関するものですが、メインのアプリケーションを管理できると確信しています)。考え)。

MSDN の Entity Framework での同時実行に関するいくつかの記事も見つけることができます。

  • オプティミスティック コンカレンシー パターン
    • Reload による楽観的同時実行例外の解決 (データベースが優先)
    • クライアントが勝ったときの楽観的同時実行例外の解決
    • オプティミスティック コンカレンシー例外のカスタム解決
    • オブジェクトを使用したオプティミスティック コンカレンシー例外のカスタム解決
  • プロパティ値の操作
    • 個々のプロパティの現在または元の値の取得と設定
    • マップされていないプロパティの現在の値を取得および設定する
    • プロパティが変更済みとしてマークされているかどうかを確認する
    • プロパティを変更済みとしてマークする
    • エンティティのすべてのプロパティの現在値、元の値、およびデータベース値の読み取り
    • 別のオブジェクトから現在の値または元の値を設定する
    • ディクショナリから現在の値または元の値を設定する
    • プロパティを使用して辞書から現在の値または元の値を設定する
    • 現在値、元の値、またはデータベース値を含む複製オブジェクトの作成
    • 複雑なプロパティの現在または元の値の取得と設定
    • DbPropertyValues複雑なプロパティへのアクセスに使用

ご覧のとおり、この状況は開発者側に完全に依存しており、同時発生の問題を自分で解決するために選択できるパターンが多数あります。

于 2015-06-04T16:21:29.327 に答える