Блокировка таблицы для обработки параллелизма в Entity Framework 3.5 - PullRequest
0 голосов
/ 03 августа 2011

У нас есть веб-сервис, который принимает XML-файл для любых неисправностей, которые возникают на транспортном средстве.Затем веб-служба использует EF 3.5 для загрузки этих файлов в гипернормализованную базу данных.Обычно XML-файл обрабатывается за 10-20 секунд.Есть два сценария параллелизма, которые мне нужно обработать:

  1. Различные транспортные средства, отправляющие файлы XML одновременно: это не проблема.Оптимистичный параллелизм EF по умолчанию гарантирует, что я могу хранить все эти файлы в одних и тех же таблицах, поскольку их данные являются взаимоисключающими.

  2. Одно и то же транспортное средство, отправляющее несколько файлов одновременно: Это создаетПроблема в том, что моя система пытается записать одинаковые или похожие данные в базу данных одновременно.И это не редкость.

Нам нужно решение для пункта 2.

Чтобы решить эту проблему, я ввел таблицу блокировок.По сути, я вставляю в эту таблицу объединенный идентификатор транспортного средства и метку времени неисправности (которая одинакова для нескольких файлов, отправленных транспортным средством по одной и той же неисправности), когда я начинаю запись в БД и удаляю запись, как только я закончу.Однако часто оба файла пытаются одновременно вставить эту строку в базу данных.В таких случаях один файл успешно выполняется, в то время как другой выдает исключение дублирующегося ключа, которое отправляется вызывающей стороне веб-службы.

Какой лучший способ справиться с такими сценариями?Я не хотел бы откатывать что-либо из БД, так как для одного файла задействовано много таблиц.

1 Ответ

1 голос
/ 03 августа 2011

А какое решение вы ожидаете?Ваш текущий подход с таблицей блокировок - именно то, что вам нужно.Если исключение сработало из-за дублирования, вы можете либо подождать и повторить попытку позже, либо выдать ошибку клиенту и позволить ему загрузить файл позже.Оба решения уродливы, но это то, что предлагает ваше приложение.

Лучшим решением было бы заменить текущую веб-службу другим решением, при котором вызов веб-службы только добавит работу в очередь, а некоторый фоновый процесс обработает эти работы и гарантирует, что два файла для одной машины не будут обрабатыватьсяодновременно.Это также обеспечило бы намного лучший контроль пропускной способности в ситуациях, когда нужно смотреть.Недостатком является то, что вы должны реализовать некоторое уведомление о том, что файл был обработан, потому что он не будет в сети.

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