我有一张桌子,其中有些物品在另一张桌子上。保存新的或用LinqToSql更新的交易?
此表是这样定义的
ID (Primary key)
ItemId (Foreign key)
Date
Hits
给予我有一个记录公关。项目公关日。
数据库用于多线程环境,因此两个用户可能会同时创建两个记录,从而导致创建两个记录,其中我只需要1个匹配= 2。 (因为一个独特的索引,我会得到一个例外)
我如何确保我只有一个记录公关。项目公关。天?
我有一张桌子,其中有些物品在另一张桌子上。保存新的或用LinqToSql更新的交易?
此表是这样定义的
ID (Primary key)
ItemId (Foreign key)
Date
Hits
给予我有一个记录公关。项目公关日。
数据库用于多线程环境,因此两个用户可能会同时创建两个记录,从而导致创建两个记录,其中我只需要1个匹配= 2。 (因为一个独特的索引,我会得到一个例外)
我如何确保我只有一个记录公关。项目公关。天?
处理此问题的一种方法是您在SQL Server中创建的索引。使用SQL Server,你可以创建一个唯一索引,但是当你尝试添加一个副本时,它会抛出一个异常,而不会重复。要做到这一点,请确保索引类型是'索引'并将'忽略重复键'设置为'是'
CREATE UNIQUE NONCLUSTERED INDEX IX_MyIndex ON MyTable
(
MyColumn
) WITH(STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = ON, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
唯一索引是可行的。这只会允许一个记录。或者,您可以在代码中设置一个锁,检查是否存在具有该ID的记录,如果该记录存在,则避免插入并通知用户该问题。但是,如果为空,那么您继续插入。
编辑:锁可设置为:
public static object _lock = new object();
public void Save(..)
{
lock(_lock) {
//check for existence of an ID
//process accordingly
}
}
它经常建议做检查之前和锁定后,因为锁被释放,先前的用户可能已经保存了记录,但是你也必须关心数据库的性能,所以也许只是在锁内进行操作就可以了......你还必须知道,这会阻止其他用户试图在锁定点保存记录,并可能影响你的应用程序的性能如果数据库很慢......你必须知道的东西。
HTH。
我不是SQL Server或.Net同步对象的专家,但是通过“锁定”,你的意思是类似于在.NET应用程序进程内部工作的互斥锁吗? – Karsten
Mutex可以工作,并且您也可以像上面所说明的那样使用锁定关键字来设置锁定,以将锁定块中的代码限制为一位用户。 –