2010-02-26 44 views
1

我有一张桌子,其中有些物品在另一张桌子上。保存新的或用LinqToSql更新的交易?

此表是这样定义的

ID (Primary key) 
ItemId (Foreign key) 
Date 
Hits 

给予我有一个记录公关。项目公关日。

数据库用于多线程环境,因此两个用户可能会同时创建两个记录,从而导致创建两个记录,其中我只需要1个匹配= 2。 (因为一个独特的索引,我会得到一个例外)

我如何确保我只有一个记录公关。项目公关。天?

回答

1

处理此问题的一种方法是您在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 
2

唯一索引是可行的。这只会允许一个记录。或者,您可以在代码中设置一个锁,检查是否存在具有该ID的记录,如果该记录存​​在,则避免插入并通知用户该问题。但是,如果为空,那么您继续插入。

编辑:锁可设置为:

public static object _lock = new object(); 

public void Save(..) 
{ 
    lock(_lock) { 
     //check for existence of an ID 
     //process accordingly 
    } 
} 

它经常建议做检查之前和锁定后,因为锁被释放,先前的用户可能已经保存了记录,但是你也必须关心数据库的性能,所以也许只是在锁内进行操作就可以了......你还必须知道,这会阻止其他用户试图在锁定点保存记录,并可能影响你的应用程序的性能如果数据库很慢......你必须知道的东西。

HTH。

+0

我不是SQL Server或.Net同步对象的专家,但是通过“锁定”,你的意思是类似于在.NET应用程序进程内部工作的互斥锁吗? – Karsten

+0

Mutex可以工作,并且您也可以像上面所说明的那样使用锁定关键字来设置锁定,以将锁定块中的代码限制为一位用户。 –