У нас есть веб-сервис, который принимает XML-файл для любых неисправностей, которые возникают на транспортном средстве.Затем веб-служба использует EF 3.5 для загрузки этих файлов в гипернормализованную базу данных.Обычно XML-файл обрабатывается за 10-20 секунд.Есть два сценария параллелизма, которые мне нужно обработать:
Различные транспортные средства, отправляющие файлы XML одновременно: это не проблема.Оптимистичный параллелизм EF по умолчанию гарантирует, что я могу хранить все эти файлы в одних и тех же таблицах, поскольку их данные являются взаимоисключающими.
Одно и то же транспортное средство, отправляющее несколько файлов одновременно: Это создаетПроблема в том, что моя система пытается записать одинаковые или похожие данные в базу данных одновременно.И это не редкость.
Нам нужно решение для пункта 2.
Чтобы решить эту проблему, я ввел таблицу блокировок.По сути, я вставляю в эту таблицу объединенный идентификатор транспортного средства и метку времени неисправности (которая одинакова для нескольких файлов, отправленных транспортным средством по одной и той же неисправности), когда я начинаю запись в БД и удаляю запись, как только я закончу.Однако часто оба файла пытаются одновременно вставить эту строку в базу данных.В таких случаях один файл успешно выполняется, в то время как другой выдает исключение дублирующегося ключа, которое отправляется вызывающей стороне веб-службы.
Какой лучший способ справиться с такими сценариями?Я не хотел бы откатывать что-либо из БД, так как для одного файла задействовано много таблиц.