방법: 데이터베이스 값과 병합하여 동시성 충돌 해결(LINQ to SQL)
업데이트: November 2007
변경 내용을 다시 제출하기 전에 예상 데이터베이스 값과 실제 데이터베이스 값의 차이점을 조정하려면 KeepChanges를 사용하여 데이터베이스 값과 현재 클라이언트 멤버 값을 병합합니다. 자세한 내용은 낙관적 동시성 개요(LINQ to SQL)를 참조하십시오.
참고: |
---|
모든 경우에 데이터베이스에서 업데이트된 데이터를 검색하여 클라이언트의 레코드를 먼저 새로 고칩니다. 이렇게 하면 다음 업데이트 시도는 동일한 동시성 검사에서 실패하지 않습니다. |
예제
이 시나리오에서는 User1이 변경 내용을 제출하려는 경우 User2가 그 동안에 Assistant 열과 Department 열을 변경했기 때문에 ChangeConflictException 예외가 throw됩니다. 다음 표에서는 상황을 보여 줍니다.
|
Manager |
Assistant |
Department |
---|---|---|---|
User1과 User2가 쿼리했을 때 원래 데이터베이스 상태 |
Alfreds |
Maria |
Sales |
User1이 변경 내용 전송 준비 |
Alfred |
|
Marketing |
User2가 이미 변경 내용 전송 |
|
Mary |
Service |
User1이 데이터베이스 값을 현재 클라이언트 멤버 값과 병합하여 이 충돌을 해결하기로 결정합니다. 그 결과, 현재 변경 집합 역시 해당 값을 변경할 때에만 데이터베이스 값을 덮어씁니다.
User1이 KeepChanges를 사용하여 문제를 해결하는 경우 데이터베이스의 결과는 다음 표와 같습니다.
|
Manager |
Assistant |
Department |
---|---|---|---|
충돌 해결 후 변경된 상태 |
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);
참고 항목
작업
방법: 데이터베이스 값을 덮어써서 동시성 충돌 해결(LINQ to SQL)
방법: 데이터베이스 값을 유지하여 동시성 충돌 해결(LINQ to SQL)