2

나는 EF4를 사용하는 일부 저장소 패턴 프로젝트에서 다음 pseduo 코드가 있습니다.이 Entity Framework 코드에서이 낙관적 동시성 오류를 어떻게 처리해야합니까?

public void Delete(int someId) 
{ 
    // 1. Load the entity for that Id. If there is none, then null. 
    // 2. If entity != null, then DeleteObject(..); 
} 

매우 간단하지만 런타임 오류 받고 있어요 : -

ConcurrencyException: Store, Update, Insert or Delete statement affected an unexpected number of rows (0).

지금,이 무슨 일이 일어나고있는 것입니다 : - EF4의

  1. 2 개 개의 인스턴스는 기계가 실행 앱을 동시에 사용할 수 있습니다.
  2. 인스턴스 A가 삭제를 호출합니다.
  3. 인스턴스 B는 나중에 나노초 초를 삭제합니다.
  4. 인스턴스 A는 엔터티를로드합니다.
  5. 인스턴스 B도 엔터티를로드합니다. 멋진 바나나 -
  6. 인스턴스 A는 이제 개체를 삭제합니다.
  7. 인스턴스 B는 개체를 삭제하려고 시도하지만 이미 사라 졌어요. 따라서, no-count 또는 no는 0 일 것입니다. 예상했을 때 .. 또는 이와 비슷한 것입니다. 기본적으로 삭제하려는 항목이 삭제되지 않았다는 것을 알아 냈습니다 (분할이 일어난 이후로).

이것이 경기 조건 또는 기타인지 확실하지 않습니다.

어쨌든, 제 2 호 충돌하지 않도록 내가 여기서 할 수있는 트릭이있다? 나는 수 있습니다 저장 프로 시저에 ..하지만 지금 당장 그것을 피하기 위해 바라고 있어요.

아이디어가 있으십니까? 그 행 (및 그 행만) 선택이 호출 될 때 잠글 수 있습니다 궁금하네요 ... 행 잠금 relased 때까지 인스턴스 B를 기다려야합니다. 그때까지는 행이 삭제되므로 인스턴스 B가 선택하면 데이터가 없으므로 절대로 삭제되지 않습니다.

+0

왜 그냥 동시성 예외를 처리하지? 개체가 다른 스레드 (일명 EF 인스턴스)에서 삭제 된 경우 레코드가 이미 삭제되었으므로이 스레드에 대한 작업이 남아 있지 않습니다. –

+0

그게 문제입니다.> 두 인스턴스가 모두 DB에서 동시에 읽었 기 때문에 삭제할 개체가 있다고 생각합니다. 인스턴스 A가 두 번째 호출 전에 나노초 (초) 인 DeleteObject (..) 메소드를 실제로 완료한다는 것입니다. 동일한 객체에 대해. 지금은 예외 처리 ..하지만 실제 문제를 피하는 것 같아요. 그리고 일부 잠금 또는 뭔가 처리 할 수 ​​있는지 궁금하네요? –

답변

0

일반적으로 당신은 OptimisticConcurrencyException를 잡을 것이다 다음의 비즈니스 모델에 대한 감각을 만드는 방식으로 문제를 처리 - 다시 SaveChanges를 부른다.

try 
{ 
    myContext.SaveChanges(); 
} 
catch (OptimisticConcurrencyException e) 
{ 
    if (e.StateEntries.FirstOrDefault() is DeletingObject) 
     myContext.Detach(e.StateEntries.First(); 
    myContext.SaveChanges(); 
} 

는 소용돌이를주고 당신이 얼마나 참조 - 시험/컴파일 또는 아무것도 - 당신이 삭제하려는 기업의 유형으로 DeletingObject을 사용했습니다. 엔티티 유형으로 대체하십시오.

+0

흠 - 흥미 롭습니다. 너는 캐치에서 너가하고있는 것을 실제로 설명 할 수 있니? 그래서 내 초기 예제와 함께, Instance_B가 삭제를한다면 .. 그리고 그것은 예외를 던졌습니다 .. 그러면 당신이 분리를 보려고합니다 .. 삭제 된 객체가 존재해서는 안되므로?) –

+0

이미 삭제 된 개체를 분리하여 상태 관리자가 해당 삭제 작업을 데이터베이스로 푸시하지 못하도록 시도하고 있습니다. 삭제해야 할 개체가 여전히 첨부되어 있으며 개체 상태가 삭제되었습니다. 방금 테스트를 실행하고 .DeleteObject (myObject)를 호출 한 다음 .Detach (myObject)를 호출하고 .SaveChanges()가 삭제를 푸시하지 않습니다. 그것에게 도움이되는지 배우자에게주고보십시오. –

+0

이게 문제를 해결 했습니까? –

관련 문제