나는 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의
- 2 개 개의 인스턴스는 기계가 실행 앱을 동시에 사용할 수 있습니다.
- 인스턴스 A가 삭제를 호출합니다.
- 인스턴스 B는 나중에 나노초 초를 삭제합니다.
- 인스턴스 A는 엔터티를로드합니다.
- 인스턴스 B도 엔터티를로드합니다. 멋진 바나나 -
- 인스턴스 A는 이제 개체를 삭제합니다.
- 인스턴스 B는 개체를 삭제하려고 시도하지만 이미 사라 졌어요. 따라서, no-count 또는 no는 0 일 것입니다. 예상했을 때 .. 또는 이와 비슷한 것입니다. 기본적으로 삭제하려는 항목이 삭제되지 않았다는 것을 알아 냈습니다 (분할이 일어난 이후로).
이것이 경기 조건 또는 기타인지 확실하지 않습니다.
어쨌든, 제 2 호 충돌하지 않도록 내가 여기서 할 수있는 트릭이있다? 나는 을 수 있습니다 저장 프로 시저에 ..하지만 지금 당장 그것을 피하기 위해 바라고 있어요.
아이디어가 있으십니까? 그 행 (및 그 행만) 선택이 호출 될 때 잠글 수 있습니다 궁금하네요 ... 행 잠금 relased 때까지 인스턴스 B를 기다려야합니다. 그때까지는 행이 삭제되므로 인스턴스 B가 선택하면 데이터가 없으므로 절대로 삭제되지 않습니다.
왜 그냥 동시성 예외를 처리하지? 개체가 다른 스레드 (일명 EF 인스턴스)에서 삭제 된 경우 레코드가 이미 삭제되었으므로이 스레드에 대한 작업이 남아 있지 않습니다. –
그게 문제입니다.> 두 인스턴스가 모두 DB에서 동시에 읽었 기 때문에 삭제할 개체가 있다고 생각합니다. 인스턴스 A가 두 번째 호출 전에 나노초 (초) 인 DeleteObject (..) 메소드를 실제로 완료한다는 것입니다. 동일한 객체에 대해. 지금은 예외 처리 ..하지만 실제 문제를 피하는 것 같아요. 그리고 일부 잠금 또는 뭔가 처리 할 수 있는지 궁금하네요? –