2

私は同時実行を管理するのは初めてなので、この質問が十分な情報に基づいていない場合はお詫びします。

過去のプロジェクトでは、次のような操作を TransactionScope でラップすることにより、同時実行チェックを実装しました。

using (var scope = new TransactionScope(TransactionScopeOption.Required, options))
{
    var copiedFolder = new Folder();
    using (var db = CreateContext())
    {
        // do stuff safely
    }
    scope.Complete();
    return copiedFolder;
}

ただし、同時実行に対するEntity Frameworkのアプローチに出くわしました: http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/handling-concurrency-with-the-entity-framework -in-asp-net-mvc-アプリケーション

そして、いつどちらを使用するのが良いのか疑問に思っています。技術的には、それらは同じものですか?そうでない場合、それらはどのように異なりますか?

4

3 に答える 3

4

それらは同じものではありません。メカニズムとしての同時実行は、2 人のユーザーが同じエンティティに同時にアクセスしているときに上書きが行われないようにするためにあります。

例を挙げましょう。名前が「Alex」に設定された ID 541 の行を想像してください。

ユーザー A とユーザー B の 2 人のユーザーがいて、両方ともその行の名前を変更しようとしているとします。次のシナリオは、同時実行のすべてです。

  • ユーザー A がデータベースからエンティティを読み取ります。
  • ユーザー B がデータベースからエンティティを読み取ります。
  • ユーザー A が Name の値を「Alexander」に変更し、変更をデータベースにコミットします。
  • ユーザー B が Name の値を「Alexander B」に変更し、変更をデータベースにコミットします。

ユーザー A が行った変更は、ユーザー B が知らないうちに上書きされます。

コンカレンシーが行っていることは、基本的に、ユーザー B の読み取りとユーザー B の変更コミットの間で値に変更があった場合、エンティティが変更されたことを示す DbConcurrencyException をスローし、ユーザー B に保存をキャンセルするか続行する機能を提供することです。

特定のプロパティが目に見えない上書きから安全であることを確認したい場合は、[ConcurrencyCheck] でマークします。Entity Framework はデフォルトで、WHERE 句に Id (ID) 列を指定して更新を行います。別の列が [ConcurrencyCheck] でマークされている場合、この例では基本的に WHERE NAME = 'Alex' となる追加の条件も UPDATE コマンドに追加されます。したがって、Alex はデータベースの値ではなくなっているため (ユーザー A が変更したため)、更新は行われず、内部的に例外が発生します。

于 2013-09-15T19:08:45.073 に答える