Учебники

Entity Framework — параллелизм

Любой разработчик доступа к данным сталкивается с трудностями, отвечая на вопрос о параллелизме данных: «Что произойдет, если несколько человек одновременно редактируют одни и те же данные?»

  • Более удачливые среди нас имеют дело с бизнес-правилами, которые говорят: «Нет проблем, последний выигрывает».

  • В этом случае параллелизм не является проблемой. Скорее всего, это не так просто, и нет серебряной пули, которая бы решала каждый сценарий одновременно.

  • По умолчанию Entity Framework выбирает путь «последний выиграл», что означает, что последнее обновление применяется, даже если кто-то обновил данные между временем получения данных и временем сохранения.

Более удачливые среди нас имеют дело с бизнес-правилами, которые говорят: «Нет проблем, последний выигрывает».

В этом случае параллелизм не является проблемой. Скорее всего, это не так просто, и нет серебряной пули, которая бы решала каждый сценарий одновременно.

По умолчанию Entity Framework выбирает путь «последний выиграл», что означает, что последнее обновление применяется, даже если кто-то обновил данные между временем получения данных и временем сохранения.

Давайте возьмем пример, чтобы понять это лучше. В следующем примере добавляется новый столбец VersionNo в таблице курса.

Таблица курса

Перейдите к конструктору и щелкните правой кнопкой мыши в окне дизайнера и выберите модель обновления из базы данных …

дизайнер

Вы увидите, что в Entity Course добавлен еще один столбец.

Курс Entity

Щелкните правой кнопкой мыши по вновь созданному столбцу VersionNo, выберите Properties и измените ConcurrencyMode на Fixed, как показано на следующем рисунке.

Новая созданная колонка

Если для параметра ConcurrencyMode of Course.VersionNo установлено значение Fixed, то при каждом обновлении курса команда Update будет искать его, используя свой EntityKey и свойство VersionNo.

Давайте посмотрим на простой сценарий. Два пользователя извлекают один и тот же курс в одно и то же время, и пользователь 1 меняет заголовок этого курса на Maths и сохраняет изменения перед пользователем 2. Позже, когда пользователь 2 меняет заголовок этого курса, который был получен до того, как пользователь 1 сохранит свои изменения, в этом В случае, если пользователь 2 получит исключение параллелизма «User2: Произошло исключение оптимистичного параллелизма» .