2016-10-21 3 views
0

현재 ASP.NET MVC 응용 프로그램에서 낙관적 동시성에 문제가 있습니다.AJAX 호출로 낙관적 동시성 디버깅

기본적으로이 컨트롤러는 한 번 호출 될 때 제대로 작동합니다. 그러나 동시에 6 개 그룹의 주민을 수정하는 페이지가 있습니다. 문제가 발생한 곳입니다. 기본적으로 각 목록마다 한 번에 하나씩 주민 목록을 게시하므로 동시에 서버에 충돌하는 6 개의 동시 아약스 호출이 있습니다. (이것은 내가 바꿀 필요가 있을지 모르지만 확실하지 않다!)

자바 스크립트 아약스 호출은 상주 ID 목록과 함께 그룹의 ID를 게시한다. 거주자는 그룹 참조에 추가됩니다. 상태를 새로 고치려고했지만 6 개 그룹 중 하나만 업데이트 된 것으로 보입니다. 나는 또한 클라이언트가 이기게하려고 노력했다. 이 문제를 해결하기위한 지침과 요령이 필요합니다. 그래서 조금 단순화 시도

var group = _context.TherapyGroups.Include(r => r.Residents) 
               .Where(x => x.ID.ToString() == groupid).FirstOrDefault(); 
      if(group == null) 
      { 
       throw new HttpResponseException(HttpStatusCode.NotFound); 
      } 
      group.Residents.Clear(); 
      foreach(var id in residents) 
      { 
       var resident = _context.Residents.Where(x => x.ID.ToString() == id).FirstOrDefault(); 
       if(resident == null) 
       { 
        throw new HttpResponseException(HttpStatusCode.NotFound); 
       } 
       group.Residents.Add(resident); 
      } 
      bool saveFailed; 
      do 
      { 
       saveFailed = false; 
       try 
       { 

        _context.SaveChanges(); 
       } 
       catch (DbUpdateException e) 
       { 
        saveFailed = true; 
        ((IObjectContextAdapter)_context).ObjectContext.Refresh(RefreshMode.StoreWins, _context.Residents); 
       } 
      } while (saveFailed); 
+0

방금 ​​주목 한 것은 _context.Residents입니다. 내가 상쾌한 _context.TherapyGroups로 바뀌었고 여전히 작동하지 않습니다. –

+0

거주자 목록이 완성되면 저장하지 않고 각 거주자가 목록에 추가 된 후 저장하지 않으시겠습니까? 또한 IoC 컨테이너를 사용하여 _context를 해결하고 있습니까? –

+0

지금 IoC를 사용하고 있지 않습니다.이 기능의 이점을 알려주는 것이 있습니까? –

답변

0

당신은 당신이 가지고있는 코드로 발생하는 문제를 해결하는 방법을하지 않도록 하였다

여기 내 컨트롤러에 내 현재 코드입니다. 도움이되는지 확인하십시오 :

var groupId = _context.TherapyGroups.FirstOrDefault(x => x.ID.ToString() == groupid).Select(x => x.ID); 

    if(groupId == "") // or if(groupId == 0), not sure type of x.ID 
    { 
     throw new HttpResponseException(HttpStatusCode.NotFound); 
    } 

    // Get all of the residents whose Id is in the residents list 
    var residentObjects = _context.Residents.Where(x => residents.Contains(x.ID.ToString())); 

    // Update the groupId for each resident 
    foreach(var resident in residentObjects) 
    { 
     resident.GroupId = groupId; 
    } 

    var saveFailed = false; 
    try 
    { 
     _context.SaveChanges(); 
    } 
    catch (DbUpdateException e) 
    { 
     saveFailed = true; 
    } 
관련 문제