如何在ASP.NET中锁定数据库表

如何在ASP.NET中锁定数据库表,asp.net,linq,locking,Asp.net,Linq,Locking,我们的项目是在ASP.NET上运行的,我们使用的是带有LINQ(lambda语法)的实体框架,我们需要防止同时插入到表中。我尝试使用ReaderWriterLock类,但它只在一个会话中有效(当在浏览器中打开更多选项卡时),但在更多不同的浏览器中无效。我还阅读了关于创建带有时间戳的表(不确定它是否能解决我们的问题)或使用事务的内容,但现在不知道如何在具有LINQ的web应用程序中使用它 您能告诉我如何在ASP.NET中处理此独占写访问权限吗?ReaderWriterLockSlim可能是一个不错

我们的项目是在ASP.NET上运行的,我们使用的是带有
LINQ
(lambda语法)的实体框架,我们需要防止同时插入到表中。我尝试使用
ReaderWriterLock
类,但它只在一个会话中有效(当在浏览器中打开更多选项卡时),但在更多不同的浏览器中无效。我还阅读了关于创建带有时间戳的表(不确定它是否能解决我们的问题)或使用事务的内容,但现在不知道如何在具有
LINQ
的web应用程序中使用它


您能告诉我如何在ASP.NET中处理此独占写访问权限吗?

ReaderWriterLockSlim可能是一个不错的选择,但如果您希望任何线程/进程都可以共享同一个锁,则整个
ReaderWriterLockSlim
必须是静态成员

也就是说,您的类应该如下所示:

public class Class1
{
     private readonly static ReaderWriterLockSlim _lock = new ReaderWriterLockSlim();
}
重要提示 使用应用层锁,您可以锁定自己的应用程序线程,以限制一个线程一次访问数据库。但是其他应用程序(不是ASP.NET应用程序,也不是IIS上另一个应用程序池中的另一个应用程序)可能能够并行访问数据库,或者执行读写操作

如果想要100%有效的解决方案,必须使用数据库事务。如果SQL Server是RDBMS,则可以使用
Serializable
隔离级别执行事务:

可以读取但不能修改易失性数据,并且不能读取新数据 在交易过程中添加


“如何在ASP.NET中锁定数据库表”-不要。让数据库做它擅长的事情。也许您可以陈述您试图解决的实际问题,而不是一个感知的解决方案。我将向您描述一种情况:一个请求有容量,但同时两个不同的用户接受注册到此容量的请求…如何防止这种情况?ReaderWriterLockSlim不会锁定数据库表,现在是吗?@MitchWheat我可以扩展我的答案,因为你不能绝对地从应用层锁定一个表。但是使用锁,你可以阻止你自己的程序从多个线程访问数据库,但我们并不知道OP的真正问题是什么。我们需要的是在一个asp.net应用程序中防止来自多个线程的多个写操作…这个Matias建议使用静态ReadWriterLockSlim似乎很好