2017-04-04 6 views
0

하나의 문제가 발생합니다. 푸른 색 테이블에 목록을 저장해야합니다. 내가하고있는 일은 그것을 문자열에 직렬화하고 저장하는 것이다. 이제 그 행을 읽을 때 업데이트 된 목록을 얻지 못한 경우가 있습니다. 결과적으로 우리가 목록에 항목을 추가하면 독서를 올리면 오래된 항목이 사라집니다. 누구든지이 문제가 발생하기 전에이 솔루션을 무엇입니까.Azure 테이블 일관성 유지

C가 B를 확장하고 B가 A를 확장하는 3 개의 클래스가 있다고 가정 해 봅시다. 이제 B와 C의 모든 객체도 A의 객체입니다. 이제 A의 모든 객체 (B c) Azure Table의 한 열에있는 목록으로. [A ', B', C ', A "] 같이 객체의 현재 상태 우리는 여러 응용 프로그램 서버가있을 때 문제가 발생합니다. 이제 Server1은 현재 목록을 가져 와서 B의 인스턴스를 목록에 추가하려고합니다. 예를 들어 [A ', B', C ', A' '] , A '', B ''] 동시에 Server2는 [A ', B', C ', A' ']로 목록을 가져오고 C' '를 추가하여 [[A', B ', C' A ''], C "]. 이제 개체 B ''에 대한 정보가 손실됩니다. 이런 종류의 문제를 완화하는 방법.

나는 도트 넷 클라이언트 라이브러리입니다. 아래 코드는 동일합니다.

TableOperation retrieveTypedInstancesOperation = TableOperation.Retrieve (partitionKey, RowKey); TableResult retrievedTypedInstancesResult = instancesTable.Execute (retrieveTypedInstancesOperation); 목록 instanceLists = 새 목록(); (retrievedTypedInstancesResult.Result! = NULL)이 {

   string instances = ((TypedInstancesRow)retrievedTypedInstancesResult.Result).Instances; 

       if (!String.IsNullOrEmpty(instances)) instanceLists = JsonConvert.DeserializeObject<List<string>>(instances); 

      } 
      instanceLists.Add(InstanceId); 

      heirarchy.PartitionKey = partitionKey; 
      heirarchy.RowKey =rowKey; 
      heirarchy.Instances = JsonConvert.SerializeObject(instanceLists); 
      TableOperation insertOperation = TableOperation.InsertOrReplace(heirarchy); 
      instancesTable.Execute(insertOperation); 
+1

코드가 없으면 아무도 아무 것도 할 수 없습니다. – Soaku

+0

설명에 따르면 행이 업데이트되지 않는 이유를 직접 확인할 수 없습니다. 목록을 업데이트하는 방법에 대한 세부 정보 코드를 게시 할 수 있습니까? 테이블 행을 업로드하는 데 사용 된 파티션 키 및 행 키. 자세한 내용을 게시 할 수 있다면 솔루션을 찾을 수있는 것이 더 쉬워 질 것입니다. –

+0

적절한 설명을 추가했습니다. 추가 정보를 제공 할 수 있는지 알려 주시기 바랍니다. – Nishant

답변

0

애저 테이블 기억이 시나리오를 관리 할 수있는 ETag 속성을 사용하는 경우.

사용중인 클라이언트 라이브러리를 알 수 없도록 코드를 제공하지 않았습니다. 따라서 귀하의 문제에 대한 요약 답변은 다음과 같습니다.

Replace (Update) 작업을 사용하는 경우 레코드를 읽을 때 얻어지는 ETag 값이 필요합니다. 원본 읽기와 업데이트 사이에 ETag 값이 변경되면 업데이트가 실패합니다. 참고 wilcard '*'값이 업데이트의 ETag 값으로 제공되면이 동작을 재정의 할 수 있습니다.

InsertOrReplace 조작을 사용하면 원래 읽기와 현재 조작 사이의 변경 사항과 상관없이 레코드가 대체됩니다. 이것은 내가 사용하고있는 작업이라고 가정합니다. 1 & 2 [ ''A '를 A', B ', C] 테이블을 읽을

서버 및 기업은 반환 : 당신이 작동 교체 사용하도록 코드를 수정하면

당신의 위의 예는 될 것 둘 다 동일한 ETag 값을가집니다.
서버 1은 원본 ETag를 포함하여 바꾸기 작업을 실행합니다. 이것은 성공적이며 필드를 [A ', B', C ', A' ', B' ']로 수정하고 테이블의 ETag 값을 변경합니다.
서버 2가 읽은 원래 ETag를 포함하여 바꾸기 작업을 실행합니다. ETag 값이 오래되었으므로 실패합니다. 이 실패를 처리하는 방법은 요구 사항에 따라 다르지만 잠재적으로 다른 사용자가 변경하여 작업이 실패했음을 클라이언트 사용자에게 알릴 필요가 있습니다. 최신 기록 상태 ([A ', B', C ', A' ', B ")를 새로운 ETag로 다시 읽는다; 사용자는 귀하의 요구 사항을 해석하므로 [A ', B', C ', A ", B", C "]로 수정할 수 있습니다.