Как сделать так, чтобы в многопоточных приложениях не было дублированных записей, созданных с использованием LINQ to SQL? - PullRequest
0 голосов
/ 24 июня 2011

Создание записей следует простой процедуре: проверьте, нет ли аналогичной записи в БД, и, если нет, создайте запись.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();
}

Проблема возникает, когда несколько параллельных потоков пытаются выполнить одно и то жекод в быстрой последовательности, запись может быть создана другим абонентом между "если запись существует?"и "если не создать новую запись".В этом случае первый вызывающий пользователь создаст дубликат.

Каков хороший способ убедиться, что дубликаты не создаются в этом сценарии?

1 Ответ

1 голос
/ 24 июня 2011

Вот несколько способов сделать это.1) Вы можете добавить уникальное ограничение для базы данных, чтобы быть абсолютно уверенным, что дубликаты не могут быть созданы.2) Инкапсулируйте код вставки данных в блок блокировки, чтобы гарантировать, что только один поток может выполнить вставку за раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...