1С Транзакция вызвала взаимоблокировку ресурсов
В 1С при выгрузке данных через внешний источник данных набором записей получил ошибку
Ошибка ODBC. SQLSTATE: 40001
Номер ошибки: 1205
Описание: [Microsoft][ODBC SQL Server Driver]Транзакция (идентификатор процесса 60) вызвала взаимоблокировку ресурсов блокировка с другим процессом и стала жертвой взаимоблокировки. Запустите транзакцию повторно.
Несколько дней потратил на поиск решения.
Помогло следующее:
- отсортировать выгружаемые данные в порядке ключевых полей, сделать выгрузку не пачками, а отдельными выгрузками в разрезе ключевых полей;
- во внешнем источнике данных перенести поля в начало таблицы (аналогично тому как это сделано в 1С с измерениями регистров), упорядочить поля аналогично ключевым полям;
- на SQL-сервере в таблице получателе создать уникальный кластерный индекс по ключевым полям в соответствии с их порядком;
- убрал транзакции;
Как понимаю проблема в том, что если нет кластерного индекса – идет блокировка большей части таблицы или всей таблицы. Если есть кластерный индекс – идет блокировка записей индекса. И конфликта блокировок не возникает. Большую роль еще играет упорядоченность данных, т.к. не происходит хаотичной блокировки таблицы. Ну и очень важно выгружать данные в каждой отдельной транзакции так чтобы в запросе был только набор уникальных измерений.