如何:通过保留数据库值解决并发冲突 (LINQ to SQL)

更新:November 2007

若要先协调预期数据库值与实际数据库值之间的差异,再尝试重新提交更改,则可以使用 OverwriteCurrentValues 保留在数据库中找到的值。然后会覆盖对象模型中的当前值。有关更多信息,请参见 开放式并发概述 (LINQ to SQL)

说明:

在所有情况下,都会先通过从数据库中检索更新后的数据来刷新客户端上的记录。此操作确保了下一次更新尝试将通过相同的并发检查。

示例

在本方案中,当 User1 尝试提交更改时将引发 ChangeConflictException 异常,原因是 User2 同时已更改了 Assistant 和 Department 列。下表说明了这种情况。

 

Manager

Assistant

Department

原始数据库在被 User1 和 User2 查询时的状态。

Alfreds

Maria

Sales

User1 准备提交这些更改。

Alfred

 

Marketing

User2 已经提交了这些更改。

 

Mary

Service

User1 决定通过用更新的数据库值覆盖对象模型中的当前值来解决此冲突。

User1 通过使用 OverwriteCurrentValues 解决了此冲突后,数据库中的结果将如下表中所示:

 

Manager

Assistant

Department

解决冲突后的新状态。

Alfreds

(原始)

Mary

(来自 User2)

Service

(来自 User2)

下面的示例代码演示了如何用数据库值覆盖对象模型中的当前值。(未对各个成员冲突进行检查或自定义处理。)

Dim db As New Northwnd("...")

Try
    db.SubmitChanges(ConflictMode.ContinueOnConflict)

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

    For Each occ As ObjectChangeConflict In db.ChangeConflicts
        ' All database values overwrite current values.
        occ.Resolve(Data.Linq.RefreshMode.OverwriteCurrentValues)
    Next

End Try
Northwnd db = new Northwnd("...");
try
{
    db.SubmitChanges(ConflictMode.ContinueOnConflict);
}

catch (ChangeConflictException e)
{
    Console.WriteLine(e.Message);
    foreach (ObjectChangeConflict occ in db.ChangeConflicts)
    {
        // All database values overwrite current values.
        occ.Resolve(RefreshMode.OverwriteCurrentValues);
    }
}

请参见

其他资源

如何:管理更改冲突 (LINQ to SQL)