锁定实体框架中的表

时间:2012-09-17 12:38:46

标签: sql entity-framework locking

我有一个SQL数据库,其中包含一个我想要锁定的表。我正在使用实体框架。基本上,每个进程都需要同时写入数据库。他们每个人都想更新某个表中的一行。但是,我希望其中只有一个能够同时执行此操作。

是否有办法锁定整个表格,例如阻止任何人放置新行或更新行?

谢谢, 基督教

2 个答案:

答案 0 :(得分:2)

我不清楚为什么你会想要这个,但如果你真的想锁定整个表,你可以:

  • 关闭行和页锁定,以便所有内容都升级为表锁

改编自here的示例:

ALTER INDEX [MyIndexName] ON [dbo].[MyTableName] SET ( ALLOW_ROW_LOCKS = OFF, ALLOW_PAGE_LOCKS = OFF)

注意:这假设您的应用程序仅“拥有”这些表 - 不想应用此项并打破其他应用程序

  • 将查询设置为使用Serializable隔离级别

改编自here的示例:

TransactionOptions topt = new TransactionOptions();   
topt.IsolationLevel = System.Transactions.IsolationLevel.Serializable;
using (var tran = new TransactionScope(TransactionScopeOption.Required, topt)) {
   //do stuff
}

答案 1 :(得分:0)

从简短的描述来看,表锁实际上是解决这个问题所需要的,这是值得怀疑的。一些可扩展性更高的常见解决方案包括:

  

1)创建一个可序列化的事务,读取或更新感兴趣的记录作为第一个语句。所有更新都应该尝试遵循这种模式。

     

2)创建一个read_committed事务,如(1),但在并发异常中包含重新读取/重试能力。

很少有人需要锁定一张桌子。有一种情况可能需要手动确定的身份字段值和与另一个会话冲突的可能性。

对于只是那个电话,可以创建一个事务,并在开始时锁定表。锁可以是" X" (独占)防止读写或非独占以防止写入。这个答案使用SP:

SO #3662766

作为替代方案,也可以使用应用程序锁定。

sp_getapplock