У меня проблема с параллелизмом в моем первом "расширенном" пакете служб SSIS.
Во-первых, вот конец пакета:
Что означает этот пакет:
- загружает данные из Excel и выполняет некоторые операции / агрегаты / элементы управления
- на основе элемента управления определяет, должна ли строка быть интегрирована (левая ветвь) или нет (правая ветвь)
- если все в порядке, выполняются некоторые вычисления, добавляется строка и записывается журнал с некоторыми показателями (это команда OLE DB левой ветви)
- если строка отклонена, она добавляется в файл отклонения и в журнал записывается некоторая статистика (команда OLE DB правой ветви)
При каждой загрузке файла создается только ОДНА строка журнала, поэтому информация об успехах и ошибках записывается в одну строку (определяется по идентификатору выполнения и имени импортированного файла, так как он может импортировать несколько файлов во время одного и того же выполнения), но заполненные столбцы не то же самое.
Обе команды OLE DB вызывают одну и ту же хранимую процедуру, которая:
- Проверяет, существует ли строка
- Если его не существует, он добавляет новую строку
- В противном случае обновляются правильные столбцы
Это работало довольно хорошо, пока кто-то не поднял проблему: иногда выполнение генерирует 2 строки: одну, содержащую информацию об успехе, и одну, содержащую отклоненные.
После анализа я заметил, что может случиться, что обе команды OLE DB выполняются одновременно, поэтому обе не видят существующей строки и обе вставляют новую.
Я хотел бы знать, есть ли способ предотвратить одновременное выполнение команд OLE DB. Производительность здесь не проблема, поэтому мне все равно, будет ли она увеличивать время выполнения.
Единственное решение, которое я вижу, это добавление уникального ограничения на таблицу и отлов ошибки, но я не уверен, что это действительно «элегантное» решение (мне не нравится идея дублирования оператора UPDATE, нормальный "один и" исключение "один), поэтому я ищу решение, которое не предусматривает перехват исключений!
Конечно, если нет лучшего решения, думаю, я сделаю это.