2011-08-09 3 views
0

EF4.0과 함께 동시성에 대해 배우고 사용되는 잠금 패턴에 대해 질문이 있습니다. 나는 비교적 일반적으로 프로그래밍과 동시성 특히, 그래서 어쩌면 내가 잘못한 단어들 ... 제발 나와 함께 베어.고정 concurrencymode로 저장하기 전에 잠금

버전 번호 속성에 고정 된 동시성 모드를 구성한다고 가정 해보십시오.

이제 데이터베이스 (컨텍스트)에서 레코드 (엔티티)를 가져 와서 일부 속성을 편집한다고 가정 해 보겠습니다. 버전은 증가하고 SaveChanges가 해당 컨텍스트에서 호출 될 때 증가합니다. 현재 데이터베이스 (컨텍스트) 버전이 원래 레코드 (엔티티)의 버전과 일치하면 저장이 계속되고, 그렇지 않으면 OptimisticConcurrencyException이 EF에 의해 처리됩니다.

이제 내 관심 분야는 다음과 같습니다. 버전 확인에는 항상 작은 시간이 있지만 작은 것이 있습니다. 이론적으로 누군가 다른 사람이 비교와 실제 저장간에 레코드를 업데이트 할 수 있었기 때문에 데이터가 손상 될 수있었습니다.

어떻게 해결 되나요? 문제가 방금 전진하는 것처럼 느껴집니다.

답변

1

은 버전을 확인하고 기록을 갱신 사이의 시간에는 기간이 없습니다. Id = @Id and Version = @OldVersion이있는 레코드가없고 0이 예외로 변환되면 Rowcount는 0을 반환합니다.

+0

아, 맞아. 진짜 대답은 내 쿼리 프로필해야합니다 :) – duress

0

이것은 locking hints을 사용하여 해결할 수 있습니다.

SQL Server의 경우 EF는 WITH UPDLOCK 데이터베이스에서 (SELECT)를 쿼리 할 수 ​​있습니다.

데이터베이스 엔진에/여러 레코드를 읽으려는 사람에게 그 이후에 업데이트를 수행 할 때까지 아무도 그 레코드를 변경할 수 없다는 것을 알려줍니다.

직접 확인하려면 Sql Server Profiler을 확인하십시오. 그러면 검색어가 실시간으로 표시됩니다.

희망이 있습니다.

주의 : 나는이 인지 확실히 말할 수 없다 당신이 그것을 스스로 할 거라고 만약 내가 확실히 자신을 확인하지만,하지 않았기 때문에 EF는이 시나리오를 처리하는 방식이 하나 개의 방식입니다 해.

UPDATE SomeTable 
SET SomeColumn = 'SomeValue' 
WHERE Id = @Id AND Version = @OldVersion 

SELECT @@ROWCOUNT 

체크를 업데이트 한 원자 작업입니다 : 데이터베이스 명령처럼 보이기 때문에

관련 문제