Поделиться через


Как разрешать конфликты параллелизма методом перезаписи значений базы данных (LINQ to SQL)

Чтобы согласовать различия между ожидаемыми и фактическими значениями базы данных до повторной отправки изменений, можно воспользоваться KeepCurrentValues для перезаписи значений базы данных. Дополнительные сведения см. в разделе Общие сведения об оптимистичном параллелизме (LINQ to SQL).

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

Во всех случаях запись на клиенте сначала обновляется путем извлечения обновленных данных из базы данных.Это действие гарантирует успешное выполнение следующей попытки обновления при тех же проверках параллелизма.

Пример

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

 

Менеджер

Помощник

Отдел

Исходное состояние базы данных при отправке запросов Пользователем1 и Пользователем2.

Алексеи

Мария

Продажи

Пользователь1 готовится отправить изменения.

Алексей

 

Маркетинг

Пользователь2 уже отправил изменения.

 

Инна

Обслуживание

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

При устранении Пользователем1 конфликта с помощью KeepCurrentValues результат в базе данных будет соответствовать данным в следующей таблице.

 

Менеджер

Помощник

Отдел

Новое состояние после устранения конфликта.

Алексей

(от Пользователя1)

Мария

(исходное значение)

Маркетинг

(от Пользователя1)

В следующем примере кода показано, как перезаписать значения базы данных текущими значениями членов клиента (проверка или пользовательская обработка конфликтов отдельных членов не выполняется).

Try
    db.SubmitChanges(ConflictMode.ContinueOnConflict)

Catch ex As ChangeConflictException
    Console.WriteLine(ex.Message)

    For Each occ As ObjectChangeConflict In db.ChangeConflicts
        ' No database values are merged into current.
        occ.Resolve(Data.Linq.RefreshMode.KeepCurrentValues)
    Next

End Try
try
{
    db.SubmitChanges(ConflictMode.ContinueOnConflict);
}

catch (ChangeConflictException e)
{
    Console.WriteLine(e.Message);
    foreach (ObjectChangeConflict occ in db.ChangeConflicts)
    {
        //No database values are merged into current.
        occ.Resolve(RefreshMode.KeepCurrentValues);
    }
}

См. также

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

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