理論上の部分
マルチスレッド環境での同時実行の問題を解決するには、次の 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
複雑なプロパティへのアクセスに使用
ご覧のとおり、この状況は開発者側に完全に依存しており、同時発生の問題を自分で解決するために選択できるパターンが多数あります。