Блокировка таблицы в транзакции SSIS - PullRequest
1 голос
/ 24 апреля 2019

У меня есть пакет служб SSIS с обработчиком событий OnError

Под моим пакетом (требуется TransactionOption) я делаю следующее

Чтение ожидающей записи статуса из таблицы SampleTable, используемой для каждого цикла (поддерживается TransactionOption)

Обновить статус этой записи как «Выполняется».

... другие заявления ...

Обновить статус записи как «Завершено». End.

У меня есть обработчик события OnError. В обработчике событий я обновляю статус как сбойный в той же записи SampleTable, и он обрабатывает блокировку таблиц (как в режиме suppoprted / notsupportde). На самом деле здесь я пытаюсь откатить все изменения, которые я сделал в потоке управления и уровне данных, кроме обработчика событий. Теперь пакет зависает в обработчике событий, когда я обновляю тот же столбец состояния записи «SampleTable», что и «сбой» (из-за блокировки транзакции).

1 Ответ

2 голосов
/ 24 апреля 2019

Причина проблемы - Вы пытаетесь изменить ту же таблицу и ту же запись таблицы внутри транзакции и с помощью обработчика ошибок. Обработчик ошибок запускается сразу после ошибочной задачи, он не ожидает завершения задачи и отката транзакции. Итак, ваша таблица и строка в этой таблице заблокированы внутри области транзакции, и обработчик событий пытается изменить ту же запись; транзакция будет прервана только после Завершения обработчика событий. Это классическая тупиковая ситуация.

Решение - измените свой подход. Обработчик ошибок не должен пытаться изменить те же данные, которые обрабатываются в основном блоке. Либо - заключите все задачи «все в одном» в контейнер последовательностей и добавьте следующую задачу - установите статус ошибки записи с ограничением приоритета - Сбой (как на рисунке). Контейнер последовательности может иметь TransactionOption = Обязательный для организации транзакции. Sample error task precedence

Альтернатива - вы можете использовать обработчик ошибок с TransactionOption = NotSupported (не подлежит отмене) и записать ошибочный идентификатор записи и дополнительную информацию в какую-то другую таблицу (чтобы избежать блокировки). Затем в потоке задач пакета - обработайте эту информацию об ошибке и обновите состояние записи.

...