4

내가 MVC 웹 API를위한 백엔드로 엔티티 프레임 워크를 사용하는 경우 하나의 컨트롤러이 (빠른 모형)과 같이 보일 수 있습니다엔티티 프레임 워크, 방지 중복 기록, 동시 연결

public class PersonController : ApiController 
    { 
     [HttpPost] 
     public void AddPerson(Person val) 
     { 
      DbContext context = new DbContext(); 
      if(!context.Persons.Any(x=>x.Email == val.Email)) 
      { 
       context.Persons.Add(val) 
       context.SaveChanges(); 
      } 
     } 
    } 

그 경우이되는 문제 작업은 몇 초에 50 번, 100 번 (아마 좋은 예가 아님) 호출되었지만 동일한 전자 메일 주소로 여러 항목을 추가 할 가능성이 높습니다.

val 매개 변수 Person의 목록라면 당신은 다른 소스에서 전화를 많이해야 할시기를 SaveChanges()하지만이 작동하지 않습니다하기 전에 누군가가 이메일 주소가 첨가 된 있는지 확인하기 위해 changetracker을 확인할 수 있습니다.

정적 인 DBContext을 사용할 수 없으므로 사용 중이라고 말하는 예외가 발생합니다.

내가 생각했던 한 가지 생각은 동일한 설정 이었지만 dbcontext의 인스턴스 (동일한 인스턴스)를 반환하지만 lock()과 같은 종류의 대기열을 만드는 정적 방법은 있지만 성능이 좋지 않을 수 있습니다. 좋은 생각이야.

어떻게이 문제를 해결할 수 있습니까?

이 예제는 내가하는 일과 관련이 없지만 시나리오를 설명하기에 간단한 내용입니다. 너무 구체적 일 필요는 없습니다.

감사

스티브

+0

새로운 사람을 독특하게 만드는 것은 무엇입니까? 동일한 전자 메일 주소를 가진 여러 사람이 허용됩니까? 아니면 이메일 속성에 대한 고유 한 제약 조건이 도움이 될 것입니다. 또한 중복 된 정보로 왜이 연산이 자주 호출되는지 이유를 고려해야합니다. – elolos

+0

나는 중복을 막을 필요가 없다. 나는 0.00001ms 전에 만들었던 기존 링크를 끌어 와서 새로운 레코드에 링크해야 할 수도있다. 이 예제는 분명히 최고는 아니 었습니다. –

답변

0

DB를 실시간으로 업데이트 할 필요가없는 경우 각 요청을 대기열에 넣을 수 있으며 대기중인 요청을 처리 할 단일 작업자 만있을 수 있습니다.

+0

이것은 유일한 옵션 이었지만 느려질 수 있으므로 이와 같은 것을 피하고 싶습니다. –

+0

오버 헤드 비용을 지불하지 않으려면 잠금을 피하십시오. 병렬 처리를 포기할 수 없다면 "기본"작업자가 메시지 그룹에서 대기열에서 제외하고 후자의 필터를 중복 제거한 다음 각각에 대해 대리인을 가질 수 있습니다 고유 한 메시지. 이 설정은 처리 부담이 작업자에게 전달되므로 웹 서비스에 대한 부담을 제거합니다. – geno

1

나는 소비자가이 서비스의 누구 또는 무엇 모른다. 그러나 동일한 사용자가 초당 여러 번 추가되는 이유는 무엇입니까? 동일한 이메일 주소를 가진 사람을 여러 번 추가하면 같은 사람을 나타내야하지만 다른 속성은 다를 수 있습니다. 질문은 그 때 당신이 "이기기"를 원하십니까? 처음이자 마지막인가?

데이터베이스의 Email 속성에 고유 제한 조건을 설정하고 예외를 적절한 방식으로 처리하는 것이 간단하고 효과적인 방법입니다.

+0

실제로는 데이터 가져 오기를 위해 5-20 개의 작업자 역할/스레드가 여러 원본에서 동일한 작업을 수행하여 모두 동일한 데이터베이스에 들어갑니다. –

1

전자 메일 테이블에 고유 한 제약 조건 인덱스를 넣으시겠습니까? 또는 SQL 트랜잭션 격리 수준을 Serializable으로 변경 하시겠습니까? 또는 고정 오브젝트를 잠그면 한 번에 하나의 메소드가 해당 메소드를 통과 할 수 있습니까?

http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx

관련 문제