2

私はこのwebmethodを持っています(Androidアプリから呼び出されます)

    [WebMethod]
    public bool addVotes(string username,string password,int votes)
    {
        bool success= false;

        if (Membership.ValidateUser(username, password) == true)
        {
            DbContext context = new DbContext();
            AppUsers user = context.AppUsers.Where(x => x.Username.Equals(username)).FirstOrDefault();
            if (user != null)
            {
                user.Votat += votes;
                context.SaveChanges();
                success = true;
            }
        }
        return success;
    }

この Web サービスは、同じ期間 (2 ~ 3 時間以内) に 80 人のユーザー (おそらく) から呼び出されます。データベースのデータの読み取りまたは更新中にデッドロックが発生する可能性があります。デッドロックの可能性があるかどうか教えてください。そのような可能性がある場合、EFやSQLなどでそれを防ぐにはどうすればよいですか。

4

1 に答える 1

1

このコードでは:できません

AppUsers user = context.AppUsers.Where(x => x.Username.Equals(username)).FirstOrDefault();

この行は読み取りロックを待機しますが、最終的には読み取りロックを取得するため、デッドロックは発生しません。

context.SaveChanges();

この行は、ユーザー テーブルを更新しようとします。書き込みロックを待ちますが、最終的に書き込みロックを取得してから移動します。
デッドロックは、複数のテーブルに対して挿入/削除/ ... を実行しているときにのみ発生する可能性があり、通常はカーソルの反復中に発生します。
EF がデッドロックに陥る状況にはまだ遭遇していないので、あまり心配する必要はありません。

たぶん、この記事が役に立つでしょう: http://blogs.msdn.com/b/diego/archive/2012/04/01/tips-to-avoid-deadlocks-in-entity-framework-applications.aspx

于 2013-09-26T09:42:26.253 に答える