我有这个网络方法(从安卓应用程序调用)
[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 服务将在同一时间段(两三个小时内)从 80 个用户(可能)调用。我担心在读取或更新数据库中的数据时会出现死锁。你能告诉我天气有死锁的可能性,如果有这种可能性,我该如何用EF或sql或其他方式防止它。
使用此代码:
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