Общие сведения об оптимистичном параллелизме (LINQ to SQL)

Технология LINQ to SQL поддерживает средства управления оптимистическим параллелизмом. В следующей таблице описываются термины, применяемые к оптимистическому параллелизму в документации LINQ to SQL.

Термины

Описание

параллелизм

Ситуация, при которой несколько пользователей одновременно пытаются обновить одну строку базы данных.

конфликт параллелизма

Ситуация, при которой несколько пользователей одновременно пытаются отправить конфликтующие значения в один или несколько столбцов строки.

управление параллелизмом

Метод, используемый для разрешения конфликтов параллелизма.

управление оптимистичным параллелизмом

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

Этот метод противоположен пессимистическому управлению параллелизмом, при котором запись блокируется для предотвращения конфликтов параллелизма.

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

разрешение конфликтов

Процесс обновления конфликтующего элемента путем повторного запроса к базе данных и последующего согласования различий.

При обновлении объекта средство отслеживания изменений LINQ to SQL содержит следующие данные:

  • значения, изначально извлеченные из базы данных и использовавшиеся для проверки обновления;

  • новые значения базы данных, полученные из последующего запроса.

После этого LINQ to SQL определяет, является ли объект конфликтующим (то есть изменилось ли одно или несколько значений его членов). Если объект является конфликтующим, LINQ to SQL далее определяет, какие его члены конфликтуют.

Каждый конфликт члена, обнаруженный LINQ to SQL, добавляется в список конфликтов.

В объектной модели LINQ to SQL оптимистический конфликт параллелизма происходит в том случае, если выполняются оба перечисленных ниже условия.

  • Клиент пытается отправить изменения в базу данных.

  • Одно или несколько значений проверки обновлений было обновлено в базе данных с момента последнего чтения этих значений клиентом.

Процесс разрешения этого конфликта включает обнаружение конфликтующих членов и принятие решения о том, какие действия следует к ним применить.

ПримечаниеПримечание

В проверках оптимистического параллелизма участвуют только те члены, которые сопоставлены свойству Always или WhenChanged.Для членов, сопоставленных свойству Never, никаких проверок не производится.Дополнительные сведения см. в разделе UpdateCheck.

Пример

Рассмотрим в качестве примера следующий сценарий, в котором Пользователь1 начинает подготовку к обновлению, запрашивая строку в базе данных. Пользователь1 получает строку со значениями "Алексеи", "Мария" и "Продажи".

Пользователь1 хочет изменить значение в столбце "Менеджер" на "Алексей", а значение в столбце "Отдел" на "Маркетинг". Прежде чем Пользователь1 смог отправить эти изменения, Пользователь2 отправил изменения в эту базу данных. Поэтому теперь значение в столбце "Помощник" изменилось на "Инна", а значение в столбце "Отдел" изменилось на "Обслуживание".

Когда пользователь Пользователь1 пытается отправить изменения, происходит сбой при отправке и возникает исключение ChangeConflictException. Этот результат происходит по той причине, что значения базы данных для столбцов "Помощник" и "Отдел" не совпадают с ожидаемыми значениями. Члены, представляющие столбцы "Помощник" и "Отдел", являются конфликтующими. Эта ситуация обобщается в следующей таблице.

 

Менеджер

Помощник

Отдел

Исходное состояние

Алексеи

Мария

Продажи

Пользователь1

Алексей

 

Маркетинг

Пользователь2

 

Инна

Служба

Подобные конфликты можно разрешать различными способами. Дополнительные сведения см. в разделе Как управлять конфликтами изменений (LINQ to SQL).

Контрольный список обнаружения и разрешения конфликтов

Конфликты можно обнаруживать и разрешать на любом уровне детализации. С одной стороны, можно разрешить все конфликты одним из трех способов (см. RefreshMode) без каких-либо дополнительных действий. С другой стороны, можно указать конкретное действие для каждого типа конфликта и для каждого конфликтующего члена.

Типы LINQ to SQL, поддерживающие обнаружение и разрешение конфликтов

Ниже перечислены классы и функции, поддерживающие разрешение конфликтов при оптимистическом параллелизме в LINQ to SQL.

См. также

Другие ресурсы

Как управлять конфликтами изменений (LINQ to SQL)