方法 : データベース値を維持することで同時実行の競合を解決する (LINQ to SQL)
更新 : November 2007
変更内容を再送信する前に、データベース内の予期した値と実際の値の違いを調整するために、OverwriteCurrentValues を使用することで、データベース内の値を維持できます。この場合、オブジェクト モデル内の現在の値は上書きされます。詳細については、「オプティミスティック同時実行の概要 (LINQ to SQL)」を参照してください。
メモ : |
---|
どの場合も、データベースの最新のデータを取得することで、クライアントのレコードがまず更新されます。この処理によって、次の更新処理が同じ同時実行チェックで失敗することを防げます。 |
使用例
このシナリオでは、ユーザー 1 が変更内容を送信しようとしたときに ChangeConflictException 例外がスローされます。途中でユーザー 2 が Assistant 列と Department 列を変更したためです。次の表は、その状況を示します。
|
Manager |
Assistant |
Department |
---|---|---|---|
ユーザー 1 およびユーザー 2 がクエリした最初のデータベース状態 |
Alfreds |
Maria |
Sales |
ユーザー 1 が送信しようとした変更内容 |
Alfred |
|
Marketing |
ユーザー 2 が既に送信した変更内容 |
|
Mary |
Service |
ユーザー 1 は、この競合を解決するために、新しいデータベース値でオブジェクト モデルの現在の値を上書きすることに決めます。
ユーザー 1 が OverwriteCurrentValues を使用して競合を解決すると、データベース内の結果は次の表のようになります。
|
Manager |
Assistant |
Department |
---|---|---|---|
競合解決後の新しい状態 |
Alfreds (元の値) |
Mary (ユーザー 2 の値) |
Service (ユーザー 2 の値) |
オブジェクト モデルの現在の値をデータベース値で上書きする方法を次のコード例に示します (個別のメンバの競合に対する検査やカスタム ハンドリングは発生しません)。
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);
}
}