EF. NET Core: несколько потоков вставки в одной транзакции - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть много строк (300k +), которые нужно в кратчайшие сроки перенести в SQL серверную базу данных, поэтому идея заключалась в том, чтобы использовать распараллеливание и разделение данных, а также использовать asyn c для закачки данных в SQL, X потоков в то время, 100 строк на контекст, причем контекст перерабатывается для минимизации накладных расходов на отслеживание. Однако это означает, что более одного соединения должно использоваться параллельно, и, таким образом, CommittableTransaction / TransactionScope будет использовать распределенную транзакцию, что приведет к тому, что операция перечисления параллельных транзакций вернет печально известное исключение "This platform does not support distributed transactions.".

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

Какие у меня варианты? Если не использовать одно соединение и никакого распараллеливания?

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

1 Ответ

3 голосов
/ 29 апреля 2020

Неа. Совершенно неверный подход. НЕ используйте EF для этого - ETL для массовых вставок - это не то, для чего созданы Object Relational Mappers, и многие проектные решения для этого неэффективны. Вы также не использовали бы маленький автомобиль вместо грузовика для перевозки 20 тонн грузов.

300 тыс. Строк - это тривиально, если вы используете SqlBulkCopy API в некотором роде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...