Linq to sql 如何确保在多线程应用程序中不使用LINQ to SQL创建重复记录?

Linq to sql 如何确保在多线程应用程序中不使用LINQ to SQL创建重复记录?,linq-to-sql,Linq To Sql,创建记录遵循一个简单的流程:检查数据库中是否没有类似的记录,如果没有,则创建一个记录。seriesInstUid不是主键。主键由SQL server创建,因为它在服务器上设置了identity属性 类似下面的代码: DataClassAsclepiusImagingDataContext db = new DataClassAsclepiusImagingDataContext(); var matchingSeries = from s in d

创建记录遵循一个简单的流程:检查数据库中是否没有类似的记录,如果没有,则创建一个记录。seriesInstUid不是主键。主键由SQL server创建,因为它在服务器上设置了identity属性

类似下面的代码:

            DataClassAsclepiusImagingDataContext db = new DataClassAsclepiusImagingDataContext();
            var matchingSeries = from s in db.Series
                                 where s.DDSeriesInstanceUID == dd.seriesInsUid
                                 select s;

            if ((matchingSeries == null) || (matchingSeries.Count() < 1))
            {
                Series ser = new Series();

                db.GetTable<Series>().InsertOnSubmit(ser);
                db.SubmitChanges();
}
当几个并发线程试图快速连续地执行同一代码时,就会出现问题。如果记录存在,则可能会由另一个调用者在两个线程之间创建一个记录?如果没有,创建新记录。在这种情况下,第一个调用方将创建一个副本


在这种情况下,什么是确保不创建副本的好方法?

这里有几种方法。 1您可以在数据库上添加唯一约束,以绝对确保不能创建重复项。
2将数据插入代码封装在锁块中,以确保一次只能有一个线程执行插入。

1似乎很有用:您能对唯一约束进行分析吗?我正在使用SQLServer2005。唯一一个必须是唯一的,并且它不是主键。谢谢。该字段不必是主键。如果您只是希望它是唯一的,您可以通过在[PRIMARY]上运行如下查询来创建一个唯一的约束:alter table Series add constraint[UN_Series_1]unique NONCCLUSTERED[DDSERIESINSTANCEID]ASC您也可以通过在SQL Server Management Studio中右键单击表格,选择设计,右键单击列,选择索引/关系,然后创建类型为Unique key的新键。如果您想在插入/更新期间执行额外的验证,可以使用触发器:列为nvarchar[MAX]类型。我认为我不能将它们设置为唯一约束,或者我可以吗?仅当所有字段都不相同的记录时,才会创建新记录。有什么想法吗?谢谢。最大大小是900字节,所以如果它是nvarchar[max],它将无法工作。但是,您可以使用上面的触发器链接来实现此目的。它将在每次插入或更新行时执行代码。如果它违反了要强制执行的条件,则可以执行任何需要验证和回滚的操作。在db.Series上创建触发器db.EnsureUnique插入后,按存在方式更新选择*从db.Series s内部联接以i插入s.DDSeriesInstanceUID=i.DDSeriesInstanceUID和[所有其他字段]BEGIN RAISERROR“记录已存在”。,16,1;回滚事务;返回端;