Я получаю файлы с несколькими строками. Я анализирую и загружаю их в базу данных. У меня есть два блока потока данных:
Получить и проанализировать файл со строками
|
V
Вставить в базу данных в FileTable, RowTable
При использовании двух блоков потока данных время немного улучшилось. Теперь я хотел еще улучшить и добавить DOP (степень параллелизма) >= 1. Это было возможно в первом блоке, поскольку он анализировал несколько файлов параллельно.
Во втором блоке я попал в контекст EF Db проблемы. Потоки пытались вставить данные в базу данных одновременно.
Entity Framework Core: вторая операция началась в этом контексте до завершения предыдущей операции.
ParseFilesBlock - DOP >= 1 (ОК)
InsertToDatabaseBlock - DOP >= 1 (ошибки контекста БД, возможные конфликты между связанными данными)
Основываясь на официальной документации, вам необходимо предоставить каждому потоку ограниченный контекст базы данных и получить сервисы.
Однако в итоге я получил услуги всеми способами:
Код: Выделить всё
void MyMethod1() {
var service1 = IServiceProvider.GetRequiredService();
...
}
- Мне неоднократно говорили, что существуют нет преимуществ при распараллеливании операций обновления/вставки базы данных. База данных создает блокировки для обеспечения целостности данных, имеет ограничения на соединения, конфликты и т. д.
- мой InsertToDatabaseBlock использует транзакции EF, и над файлом и его файлом выполняется несколько операций вставки/обновления. содержание. В нескольких файлах могут быть данные, связанные друг с другом (строка помечается как завершенная на основе содержимого из нескольких файлов), и тогда несколько потоков могут создавать противоречивые данные.
Операции записи в БД настолько проблематичны при распараллеливании, что их всегда следует избегать?
Подробнее здесь: https://stackoverflow.com/questions/793 ... operations
Мобильная версия