我们的项目在 ASP.NET 上运行,我们使用带有LINQ
(lambda 语法)的实体框架,我们需要防止同时插入到表中。我尝试使用ReaderWriterLock
类,但它仅在一个会话中有效(在浏览器中打开更多选项卡时),但在更多不同的浏览器中无效。我还阅读了有关创建带有时间戳的表(不确定它是否可以解决我们的问题)或使用事务的信息,但现在不知道如何在带有LINQ
.
你能告诉我如何在 ASP.NET 中处理这种独占的写访问吗?
这 ReaderWriterLockSlim
可能是一个不错的选择,但是如果您希望任何线程/进程都可以共享相同的锁,那么整体ReaderWriterLockSlim
必须是静态成员。
也就是说,你的类应该是这样的:
public class Class1
{
private readonly static ReaderWriterLockSlim _lock = new ReaderWriterLockSlim();
}
使用应用层锁,您将能够锁定您自己的应用程序线程,以限制一个线程一次访问数据库。但是其他应用程序(不是 ASP.NET 应用程序,或者在 IIS 上的另一个应用程序池中的另一个应用程序)可能能够并行访问数据库进行读取和写入。
如果你想要一个 100% 有效的解决方案,你必须使用数据库事务。如果 SQL Server 是 RDBMS,则可以进行具有Serializable
隔离级别的事务:
易失性数据可以读取但不能修改,事务过程中不能添加新数据。