2

我有这个网络方法(从 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;
    }

在同一时间段内(两到三个小时内)将有 80 个用户(可能)调用此 Web 服务。恐怕在读取或更新数据库中的数据时会发生死锁。你能告诉我天气有可能发生死锁吗?如果有这种可能性,我怎么能用 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 回答