У меня есть много строк (300k +), которые нужно в кратчайшие сроки перенести в SQL серверную базу данных, поэтому идея заключалась в том, чтобы использовать распараллеливание и разделение данных, а также использовать asyn c для закачки данных в SQL, X потоков в то время, 100 строк на контекст, причем контекст перерабатывается для минимизации накладных расходов на отслеживание. Однако это означает, что более одного соединения должно использоваться параллельно, и, таким образом, CommittableTransaction
/ TransactionScope
будет использовать распределенную транзакцию, что приведет к тому, что операция перечисления параллельных транзакций вернет печально известное исключение "This platform does not support distributed transactions."
.
I Нужна возможность зафиксировать / откатить весь набор upserts. Его часть процесса пакетной загрузки и любая ошибка должны откатить изменения до ранее работающего / стабильного состояния, в зависимости от приложения.
Какие у меня варианты? Если не использовать одно соединение и никакого распараллеливания?
Примечание. Проблема не так проста, как пакет команд вставки, если бы это было так, я бы просто сгенерировал вставки и запустил их на сервере как запрос или действительно использовал SqlBulkCopy
. Около половины из них являются обновлениями, половина - вставки, в которых SQL Сервер генерирует новые ключи, которые необходимо получить и повторно набрать на дочерних объектах, которые будут вставлены далее, строки распределены по дюжине таблиц в 3- иерархия уровней.