次の方法で共有


方法 : データベース値とマージすることで同時実行の競合を解決する (LINQ to SQL)

更新 : November 2007

変更内容を再送信する前に、データベース内の予期した値と実際の値の違いを調整するために、KeepChanges を使用して、データベース内の値を現在のクライアント メンバ値とマージできます。詳細については、「オプティミスティック同時実行の概要 (LINQ to SQL)」を参照してください。

Bb386918.alert_note(ja-jp,VS.90).gifメモ :

どの場合も、データベースの最新のデータを取得することで、クライアントのレコードがまず更新されます。この処理によって、次の更新処理が同じ同時実行チェックで失敗することを防げます。

使用例

このシナリオでは、ユーザー 1 が変更内容を送信しようとしたときに ChangeConflictException 例外がスローされます。途中でユーザー 2 が Assistant 列と Department 列を変更したためです。次の表は、その状況を示します。

 

管理者

Assistant

Department

ユーザー 1 およびユーザー 2 がクエリした最初のデータベース状態

Alfreds

Maria

Sales

ユーザー 1 が送信しようとした変更内容

Alfred

 

Marketing

ユーザー 2 が既に送信した変更内容

 

Mary

サービス

ユーザー 1 は、この競合を解決するために、データベース値を現在のクライアント メンバ値にマージすることに決めます。その結果、現在の変更セットでも値が変更されているデータベース値のみが上書きされます。

ユーザー 1 が KeepChanges を使用して競合を解決すると、データベース内の結果は次の表のようになります。

 

管理者

Assistant

Department

競合解決後の新しい状態

Alfred

(ユーザー 1 の値)

Mary

(ユーザー 2 の値)

Marketing

(ユーザー 1 の値)

次の例では、クライアントでも値が変更されている場合を除き、データベース値を現在のクライアント メンバ値にマージする方法を示しています。個別のメンバの競合に対する検査やカスタム ハンドリングは発生しません。

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);

参照

処理手順

方法 : データベース値を上書きすることで同時実行の競合を解決する (LINQ to SQL)

方法 : データベース値を維持することで同時実行の競合を解決する (LINQ to SQL)

その他の技術情報

方法 : 変更の競合を管理する (LINQ to SQL)