使用LinqToSql保存新的或更新,交易?

时间:2010-02-26 13:22:27

标签: c# .net database linq-to-sql transactions

我有一个表格,其中包含另一个表格中某些项目的点击统计信息。

此表定义如下

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

给我一​​个记录pr。项目pr日。

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

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

2 个答案:

答案 0 :(得分:2)

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

编辑:锁定可以设置为:

public static object _lock = new object();

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

通常建议在锁定之前和之后进行检查,因为当锁定被释放时,之前的用户可能已经保存了记录,但您还必须关注数据库性能,所以可能只是这样做在锁内部是可以的......你还必须意识到这会阻止其他用户试图在锁定点保存记录,并且如果数据库很慢,可能会影响你的应用程序的性能...你会做的事情必须要注意。

HTH。

答案 1 :(得分: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