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

有没有一种锁定整个表的方法,例如防止任何人放置新行或更新行?

谢谢,克里斯蒂安

#1楼 票数:2 已采纳

我不清楚您为什么会想要这样做,但是如果您确实想锁定整个表,则可以:

  • 关闭行和页锁定,以便一切升级为表锁

这里改编的示例:

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
}

#2楼 票数:0

从简短的描述中,可疑的是,表锁是否确实是解决此问题所需要的。 一些更可扩展的常见解决方案包括:

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

2)创建一个类似于(1)的read_committed事务,但是包含并发异常的重读/重试功能。

很少有人需要锁定表。 在一种情况下,可能需要进行一些手动确定的标识字段值的计算以及与另一会话发生冲突的机会。

对于该调用 ,可以创建一个事务并将表锁定在开头。 锁可以是“ X”(排他性)以防止读写,也可以是非排他性以防止写入。 此答案使用SP:

所以#3662766

或者,也可以使用应用程序锁。

sp_getapplock

  ask by Christian translate from so

未解决问题?本站智能推荐:

2回复

T-SQL使用锁定表选择不同的行

我有一个付款系统,但有一个问题。 我将尝试提供一个再现它的最小示例。 对数据库的访问是使用Entity Framework 6实现的,但在该问题中似乎并不重要。 有一个表Payments (ID IDENTITY (1,1) bigint, Status int) ,其中包含系统中的所有
1回复

锁表读取

我们有一个电子商务网站,人们可以在其中购买礼品卡。 这些卡存储在表中,并按整数排序以用于物流。 如果有人购买了礼品卡,我们将在数据库中插入一个采购订单,并编辑第一张合格卡的字段,以便知道该礼品卡不再可用。 但是有时候,当两个用户同时购买一张卡时,两者都会得到相同的卡。 因此,我们使用I
1回复

使用SQLdB列作为EntityFramework中并发操作的锁

我们有一个运行时间较长的用户操作,它由一组工作进程处理。 数据输入和输出来自Azure SQL。 主要的Azure SQL表结构列近似为 beingProcessed为布尔值, lastTimeProcessed为DateTime。 每个工作角色中的逻辑如下所示,并且有多个工作进程处
1回复

实体框架和COM+

我在使用实体框架和COM +时遇到问题。 体系结构是这样的: Windows服务每n分钟调用一次COM的四种方法。 COM +然后在业务层上调用相应的方法。 业务层调用DAL。 DAL然后将列表返回到业务层。 这是通过调用.ToList() 当我尝试运行服务时,DAL
2回复

如何在实体框架中处理促销代码分配而不会发生冲突?

假设我有一张促销代码表和一张联系表。 每个联系人可以具有1个促销代码,每个促销代码只能分配给1个联系人。 我将如何使用一个分配程序,该程序将从表中选择一个促销代码,然后将其分配给联系人,而不会出现并发问题/冲突。 最坏的情况是: 联系人A请求代码。 找到第一个可用的促销代码,
1回复

实体框架/SQLServer数据库锁

我很难理解是什么锁定了我的SQL Server数据库。 我正在通过实体框架从SQL Server数据库访问数据。 当该Web应用程序运行时,我也在使用SQL Server Management Studio检查数据。 显然,当我尝试通过右键单击“选择顶部n行”读取不同的表时,我收到一条消
1回复

像PostgreSQL中那样在MySQL中锁定表

我的问题是,我想插入一个新行,该行的计算值取决于在事务中较早执行的选择。 但切忌,即并行事务插入相同的计算值。 应该通过事务隔离级别SERIALIZABLE避免此问题。 但事实并非如此。 我执行以下步骤: 交易A:开始; 交易B:开始; 交易A:从tableName
1回复

用EF6锁定行

使用SQL Server 2012,ASP.NET 4.6.2和EF6。 我有一张网址表。 每个网址必须通过API调用经历许多第三方流程,并且状态会反映在该表中。 我打算使用某种预定的后台进程来启动这些进程。 我想出了一个类似的结构: 当行进入表中时,AwaitingProcessi