Запретить параллельное выполнение команд OLE DB в SSIS - PullRequest
0 голосов
/ 16 ноября 2011

У меня проблема с параллелизмом в моем первом "расширенном" пакете служб SSIS.

Во-первых, вот конец пакета: SSIS Package

Что означает этот пакет:

  • загружает данные из Excel и выполняет некоторые операции / агрегаты / элементы управления
  • на основе элемента управления определяет, должна ли строка быть интегрирована (левая ветвь) или нет (правая ветвь)
  • если все в порядке, выполняются некоторые вычисления, добавляется строка и записывается журнал с некоторыми показателями (это команда OLE DB левой ветви)
  • если строка отклонена, она добавляется в файл отклонения и в журнал записывается некоторая статистика (команда OLE DB правой ветви)

При каждой загрузке файла создается только ОДНА строка журнала, поэтому информация об успехах и ошибках записывается в одну строку (определяется по идентификатору выполнения и имени импортированного файла, так как он может импортировать несколько файлов во время одного и того же выполнения), но заполненные столбцы не то же самое.

Обе команды OLE DB вызывают одну и ту же хранимую процедуру, которая:

  • Проверяет, существует ли строка
  • Если его не существует, он добавляет новую строку
  • В противном случае обновляются правильные столбцы

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

Я хотел бы знать, есть ли способ предотвратить одновременное выполнение команд OLE DB. Производительность здесь не проблема, поэтому мне все равно, будет ли она увеличивать время выполнения.

Единственное решение, которое я вижу, это добавление уникального ограничения на таблицу и отлов ошибки, но я не уверен, что это действительно «элегантное» решение (мне не нравится идея дублирования оператора UPDATE, нормальный "один и" исключение "один), поэтому я ищу решение, которое не предусматривает перехват исключений!
Конечно, если нет лучшего решения, думаю, я сделаю это.

Ответы [ 2 ]

3 голосов
/ 16 ноября 2011

Вы должны быть в состоянии объединить два пути журнала в одну операцию записи.К сожалению, это означает, что их нужно будет отсортировать: http://msdn.microsoft.com/en-us/library/ms141703.aspx

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

1 голос
/ 16 ноября 2011

Поскольку вы используете сохраненный процесс в команде OLEDB, вы можете просто использовать объединение.таким образом, вам не нужно сортировать.Команда OLEDB будет обрабатываться один раз для каждой строки.

...