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

时间:2011-06-23 22:17:10

标签: linq-to-sql

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

如下面的代码:

            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();
}

当一些concurent线程试图快速连续执行相同的代码时,问题发生了,记录可能由另一个调用者在“if record exists?”之间创建。和“如果不创造新的记录”。在这种情况下,第一个调用者将创建一个副本。

确保在此方案中不创建重复项的有效方法是什么?

1 个答案:

答案 0 :(得分:1)

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