共用方式為


HOW TO:藉由合併資料庫值來解決並行衝突 (LINQ to SQL)

若要先協調預期和實際資料庫值之間的差異再重新送出變更,可以使用 KeepChanges 來合併資料庫值與目前用戶端成員值。 如需詳細資訊,請參閱開放式並行存取概觀 (LINQ to SQL)

注意事項注意事項

在所有情況下,擷取資料庫中更新過的資料會先重新整理用戶端上的資料錄。這個動作可確保下一次嘗試更新時,不會在相同的並行存取檢查時失敗。

範例

在這個案例下,當 User1 嘗試送出變更時,因為 User2 同時變更了 Assistant 和 Department 資料行,所以會擲回 ChangeConflictException 例外狀況。 下表顯示這個情況。

 

Manager

Assistant

Department

User1 和 User2 查詢時的原始資料庫狀態。

Alfreds

Maria

Sales

User1 準備送出這些變更。

Alfred

 

Marketing

User2 已送出這些變更。

 

Mary

Service

User1 決定合併資料庫值與目前用戶端成員值,來解決這個衝突。 這樣只有在目前變更集也修改該值時,才會覆寫資料庫值。

User1 使用 KeepChanges 解決衝突時,資料庫中的結果會如同下表:

 

主管

助理

部門

解決衝突後的新狀態。

Alfred

(來自 User1)

Mary

(來自 User2)

Marketing

(來自 User1)

下列範例顯示如何合併資料庫值與目前用戶端成員值 (除非用戶端也變更該值)。 但不會對個別成員衝突進行任何檢查或自訂處理。

Try
    db.SubmitChanges(ConflictMode.ContinueOnConflict)

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

    For Each occ As ObjectChangeConflict In db.ChangeConflicts
        ' Automerge database values into current for members
        ' that client has not modified.
        occ.Resolve(Data.Linq.RefreshMode.KeepChanges)
    Next

End Try

' Submit succeeds on second try.
db.SubmitChanges(ConflictMode.FailOnFirstConflict)
try
{
    db.SubmitChanges(ConflictMode.ContinueOnConflict);
}

catch (ChangeConflictException e)
{
    Console.WriteLine(e.Message);
    // Automerge database values for members that client
    // has not modified.
    foreach (ObjectChangeConflict occ in db.ChangeConflicts)
    {
        occ.Resolve(RefreshMode.KeepChanges);
    }
}

// Submit succeeds on second try.
db.SubmitChanges(ConflictMode.FailOnFirstConflict);

請參閱

工作

HOW TO:藉由覆寫資料庫值來解決並行衝突 (LINQ to SQL)

HOW TO:藉由保留資料庫值來解決並行衝突 (LINQ to SQL)

其他資源

HOW TO:管理變更衝突 (LINQ to SQL)