2013-05-28 4 views
2

관리 푸른 저장 클라이언트를 사용하여, 나는 푸른 표 스토리지에 삽입 작업의 간단한 배치를 보내려고하지만 전체 일괄 트랜잭션이 무효화되는 것을 보인다 그리고, ExecuteBatch 메서드 자체는 기존 레코드에 대한 배치에 단일 삽입이있는 경우 Exception을 throw합니다. (2.0 클라이언트를 사용)푸른 표 스토리지 배치 삽입

public class SampleEntity : TableEntity 
{ 
    public SampleEntity(string partKey, string rowKey) 
    { 
     this.PartitionKey = partKey; 
     this.RowKey = rowKey; 
    } 
} 


var acct = CloudStorageAccount.DevelopmentStorageAccount; 
var client = acct.CreateCloudTableClient(); 
var table = client.GetTableReference("SampleEntities"); 

var foo = new SampleEntity("partition1", "preexistingKey"); 
var bar = new SampleEntity("partition1", "newKey"); 

var batchOp = new TableBatchOperation(); 
batchOp.Add(TableOperation.Insert(foo)); 
batchOp.Add(TableOperation.Insert(bar)); 

var result = table.ExecuteBatch(batchOp); // throws exception: "0:The specified entity already exists." 

일괄 레벨 예외 InsertOrMerge를 사용하여 회피 그런데 모든 개별 동작 응답은 특정 동작을 삽입하거나 병합 여부, 204를 반환한다. 따라서 클라이언트 응용 프로그램이 클러스터의 다른 노드에 레코드를 삽입했는지 여부에 대한 지식을 유지하는 것은 불가능한 것처럼 보입니다. 유감스럽게도, 현재의 경우이 지식은 일부 다운 스트림 동기화에 필요합니다.

삽입의 배치가 진행 담요 예외를 던지는없이 당 항목 특정 응답 코드를 반환 할 수 있도록 일부 구성이나 기술이 있습니까? 당신이 이미 알고 있듯이 일괄 트랜잭션 작업이기 때문에

답변

1

, 당신은 거래의 모 아니면 없음 종류를 얻을. 배치 트랜잭션에서 흥미로운 점 중 하나는 배치에서 첫 번째로 실패한 엔티티의 인덱스를 얻는 것입니다. 따라서 일괄 처리에 100 개의 엔티티를 삽입하려고하고 50 번째 엔티티가 이미 테이블에 존재한다고 가정하면 배치 작업은 실패한 엔티티 (이 경우 49 개)의 색인을 제공합니다.

삽입 의 배치가 진행하고 담요 예외를 던지는없이 당 항목 특정 응답 코드를 반환 할 수 있도록 일부 구성이나 기술이 있습니까?

난 그렇게 생각하지 않습니다. 첫 번째 엔티티가 실패하자마자 트랜잭션이 실패합니다. 다른 주체를 처리하려고 시도조차하지 않을 것입니다. 내가 제대로, 당신의 핵심 요구 사항 엔티티를 삽입하거나 합병 (또는 대체) 된 경우 식별하는 것입니다 이해한다면

가능한 해결책은

(그냥 큰 소리로 :)을 생각). 이를 위해 실패한 엔티티를 배치에서 분리하여 별도로 처리하는 방법이 있습니다. 이를 바탕으로, 나는 두 가지 방법을 생각할 수 있습니다

당신은 아마도이 경우에는 무엇을 할 수 있는지
  1. 3 개 배치에 그 배치를 분할 : 49 개체를 포함 할 것이다 첫번째 배치, 2 배치 단지 1 개체를 포함합니다 (실패한 경우)이고 세 번째 일괄 처리에는 50 엔티티가 포함됩니다. 이제 첫 번째 배치에 모든 요소를 ​​삽입하고 그 실패한 요소로 수행 할 내용을 으로 결정한 다음 세 번째 배치를 삽입하십시오. 이 작업이 완료 될 때까지이 과정을 반복하여 반복해야합니다. .
  2. 또 다른 아이디어는 실패한 엔티티를 일괄 처리에서 제거하고 해당 일괄 처리를 다시 시도하는 것입니다. 위의 예에서 첫 번째 시도에서 100 개의 엔티티를 시도하고 두 번째 시도에서는 99 엔티티 등을 시도하고 실패한 엔티티를 모두 추적합니다. while (이유가있는 왜 그들이 실패했는지에 관해서). 일단 작업이 성공적으로 완료되면 모든 실패한 엔티티를 사용할 수 있습니다.