1С Транзакция вызвала взаимоблокировку ресурсов

В 1С при выгрузке данных через внешний источник данных набором записей получил ошибку

Ошибка ODBC. SQLSTATE: 40001
Номер ошибки: 1205
Описание: [Microsoft][ODBC SQL Server Driver]Транзакция (идентификатор процесса 60) вызвала взаимоблокировку ресурсов блокировка с другим процессом и стала жертвой взаимоблокировки. Запустите транзакцию повторно.

Несколько дней потратил на поиск решения.

Помогло следующее:

  • отсортировать выгружаемые данные в порядке ключевых полей, сделать выгрузку не пачками, а отдельными выгрузками в разрезе ключевых полей;
  • во внешнем источнике данных перенести поля в начало таблицы (аналогично тому как это сделано в 1С с измерениями регистров), упорядочить поля аналогично ключевым полям;
  • на SQL-сервере в таблице получателе создать уникальный кластерный индекс по ключевым полям в соответствии с их порядком;
  • убрал транзакции;

Как понимаю проблема в том, что если нет кластерного индекса – идет блокировка большей части таблицы или всей таблицы. Если есть кластерный индекс – идет блокировка записей индекса. И конфликта блокировок не возникает. Большую роль еще играет упорядоченность данных, т.к. не происходит хаотичной блокировки таблицы. Ну и очень важно выгружать данные в каждой отдельной транзакции так чтобы в запросе был только набор уникальных измерений.

Поделиться:

Читайте также: