我有一个带有要锁定的表的 SQL 数据库。我正在使用实体框架。基本上,有许多进程都想同时写入数据库。他们每个人都想更新某个表中的一行。但是,我只希望其中一个能够同时执行此操作。
有没有办法锁定整个表,例如防止任何人放置新行或更新行?
谢谢,克里斯蒂安
我有一个带有要锁定的表的 SQL 数据库。我正在使用实体框架。基本上,有许多进程都想同时写入数据库。他们每个人都想更新某个表中的一行。但是,我只希望其中一个能够同时执行此操作。
有没有办法锁定整个表,例如防止任何人放置新行或更新行?
谢谢,克里斯蒂安
我不清楚你为什么想要这个,但如果你真的想锁定整个表,你可以:
改编自此处的示例:
ALTER INDEX [MyIndexName] ON [dbo].[MyTableName] SET ( ALLOW_ROW_LOCKS = OFF, ALLOW_PAGE_LOCKS = OFF)
注意:这假设您的应用程序完全“拥有”这些表 - 不想应用它并破坏其他一些应用程序
改编自此处的示例:
TransactionOptions topt = new TransactionOptions();
topt.IsolationLevel = System.Transactions.IsolationLevel.Serializable;
using (var tran = new TransactionScope(TransactionScopeOption.Required, topt)) {
//do stuff
}
从简短的描述来看,表锁是否真的是解决这个问题所需要的,这是值得怀疑的。一些更具可扩展性的常见解决方案包括:
1)创建一个可序列化的事务,读取或更新感兴趣的记录作为第一条语句。所有更新都应尝试遵循此模式。
2) 创建一个类似于 (1) 的 read_committed 事务,但包括对并发异常的重读/重试能力。
很少有人需要锁定一张桌子。在一种情况下,当涉及手动确定的身份字段值的一些计算以及与另一个会话发生冲突的机会时,可能需要这样做。
对于这个调用,可以创建一个事务并在开始时锁定表。锁可以是“X”(独占)以防止读取和写入,也可以是非独占以仅防止写入。这个答案使用了一个 SP:
作为替代方案,也可以使用应用程序锁。