Как бороться с параллелизмом на EF Core - PullRequest
0 голосов
/ 30 января 2019

У меня есть метод, который ищет объект в базе данных и пытается создать его, если он не существует.Например:

public async Country FindOrCreate(string name)
{
    var country = _context.Countries.FirstOrDefault(p => p.Name == name);

    if (country != null)
        return country;

    country = new Country
    {
        Name = name
    };

    _context.Countries.Add(country);
    _context.SaveChanges();

    return country;
}

Проблема в том, что в фоновом режиме есть несколько задач, вызывающих FindOrCreate одновременно.Я предотвратил вставку дубликатов, создав уникальный индекс, но происходит следующее, вызывая нежелательные исключения:

  1. Задача A пытается найти страну и не удается
  2. Задача B пытается найтиСтрана и не удается
  3. Задача A пытается создать страну и успешно
  4. Задача B пытается создать страну и не удается

Каков будет подходящий способ обработки этих сценариевпараллелизма?Должен ли я работать с замками с использованием кода C #?Или я должен установить транзакцию?ТИА

1 Ответ

0 голосов
/ 30 января 2019

Обработка параллелизма на уровне БД с использованием уникального индекса является правильным подходом.Уникальный индекс гарантирует уникальность стран, независимо от того, что.

Не беспокойтесь о блокировке кода C #, он не будет работать, как только ваше приложение будет запущено более чем на одном сервере (в наши дни это, вероятно,).Транзакции в этом случае - хитрый бизнес , поэтому я бы не стал беспокоиться.

Как обработать эти исключения:

В случае сбоя вашей задачи при создании страны, поймайте исключениеи повторите попытку.Если по какой-то причине вам не удалось получить страну во второй раз, зарегистрируйте исключение и произойдет сбой.

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