【问题标题】:Will Entity Framework and SQL Server lock a object/record while deleting it实体框架和 SQL Server 会在删除对象/记录时锁定它吗
【发布时间】:2012-03-15 17:31:56
【问题描述】:

我在我的 asp.net MVC Web 应用程序中使用两种方法删除一些对象和行:第一种方法包括删除实体框架对象,例如:

public void DeleteMyObject(MyObject a)
{
    entities1.MyObject.Remove(a);
}

而第二种方法是从我的存储库方法中调用存储过程来删除数据库行,例如:

public void Deleteuserclass(string a, int u)
{
     entities1.deleteuserclass(a, u); 
}

调用以下存储过程:

ALTER PROCEDURE dbo.deleteuserclass
    @userid nvarchar(50),
    @classid int
AS
Begin
    Delete from Users_Classes where UserID = @userid  AND ClassID = @classid

    if @@rowcount = 0     
        Raiserror('No record deleted',1,16) 
END

使用上述两种方法中的任何一种;我是否可以确信,如果两个删除同一对象的删除请求同时到达服务器,那么只有一个请求会从数据库中删除记录,而另一个请求会收到异常(我的意思是实体框架或SQL Server 数据库在删除行时锁定行?)?

BR

【问题讨论】:

  • 这不是一个锁.. 两个连接根本不可能在同一时刻删除相同的记录。一个必须在另一个之前发生。最后到达的那个会抛出异常。

标签: asp.net-mvc-3 sql-server-2008 entity-framework stored-procedures


【解决方案1】:

一个或另一个将首先执行。

如果你的存储过程被第二次执行,你会因为存储过程中的 if 语句而得到一个异常。

如果第二次执行 EF 命令会出现 OptimisticConcurrencyException,见:EF eqivalent for rows affected of SqlCommand.ExecuteNonQuery

【讨论】:

  • 在实体框架上,如果对象已被删除,我通常会收到空引用异常,我认为如果应用程序尝试更新对象而不是删除,则会引发 OptimisticConcurrencyException!..
  • 以及DbUpdateConcurrencyException和OptimisticConcurrencyException有什么区别
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多