在Entity Framework中锁定表格

7

我有一个SQL数据库,其中有一张表需要锁定。我正在使用Entity Framework。基本上,有许多进程希望同时写入数据库。每个进程都希望更新某个表中的一行。然而,我只希望其中一个能够在同一时间内执行此操作。

是否有一种方法可以锁定整个表,以防止任何人插入新行或更新行?

谢谢, Christian


2
这是默认行为。如果您在一个操作中更改多个表,则除使用事务外,您不应该做任何其他操作。 - Tony Hopkinson
2个回答

2

我不清楚你为什么想要这样做,但如果你确实想锁定整个表格,可以采取以下措施:

  • 关闭行级锁和页面级锁,使所有内容逐步升级到表级锁

示例源自此处

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

注意:这假设你的应用程序唯一“拥有”这些表 - 不想应用这个并破坏其他应用程序

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

示例改编自此处

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

0
从简短的描述中,值得怀疑表锁确实是解决此问题所需的。更可扩展的一些常见解决方案包括:
1)创建一个可串行化事务,将感兴趣的记录作为第一条语句读取或更新。所有更新都应尝试遵循此模式。
2)创建一个像 (1) 那样的 read_committed 事务,但在并发异常时包括重新读取/重试的能力。
几乎不需要锁定表格。一个情况下可能需要时是当手动确定标识字段值涉及某些计算且存在与另一个会话碰撞的机会时。
对于 "只是那个调用",可以创建一个事务并在开始时锁定表。锁定可以是 "X" (独占) 以防止读取和写入,或者是非独占的,仅防止写入。这个答案使用了一个 SP: SO #3662766 作为替代方案,还可以使用应用程序锁。

sp_getapplock


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接