2017-04-04 107 views
0

我遇到了一個問題。我必須在天藍色的表格中存儲一個列表。我正在做的是將它序列化爲一個字符串並存儲它。現在,當我閱讀那行時,有些情況下我沒有得到更新的列表。如果我們在列表中添加任何項目,結果發佈後,較舊的會丟失。有沒有人遇到過這個問題,以及對此有何解決方案。Azure Table保持一致性

爲了詳細說明,假設我們有3類,其中C擴展B和B擴展A. 現在B的任何物體和C也A. 的對象現在讓我們說,我們維持A(包括B的所有對象和c)作爲一列Azure表中的列表。當前狀態爲[A',B',C',A'] 當我們有多個應用程序服務器時會發生問題。現在Server1想通過取當前列表來添加B的實例,例如[A',B',C',A'']追加新的實例讓B''使它成爲[A',B',C' A',B',B''] 與此同時,Server2獲得列表爲[A',B',C',A'']並附加C''以使[[A',B',C' A ''],C '']。 現在關於對象B「的信息丟失了。 如何緩解這類問題。

我是usign dot net客戶端庫。 下面是代碼相同

TableOperation retrieveTypedInstancesOperation = TableOperation.Retrieve(partitionKey,RowKey); TableResult retrievedTypedInstancesResult = instancesTable.Execute(retrieveTypedInstancesOperation); List instanceLists = new List(); 如果(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

Azure Table中存儲使用ETag的屬性來管理此方案。

你還沒有提供你的代碼,所以我們不知道你使用的是什麼客戶端庫。因此,您的問題的摘要答案是:

如果您使用ReplaceUpdate)操作,則需要在讀取記錄時獲取的ETag值。如果ETag值在原始讀取和更新之間發生了變化,則更新將失敗。請注意,如果提供wilcard「*」值作爲更新的ETag值,則可以覆蓋此行爲。

如果您使用InsertOrReplace操作,則無論原始讀取和當前操作之間的任何更改,記錄都將被替換。這是我的假設,這是你正在使用的操作。

如果您修改代碼以使用替換操作你上面的例子將成爲:

服務器1 & 2讀取表[A「 B」,C」,A‘’]和實體返回兩者具有相同的ETag值。
服務器1發出替換操作,包括原始ETag;這是成功的,並將字段修改爲[A',B',C',A'',B'']並更改表中的ETag值。
服務器2發出一個替換操作,包括它讀取的原始ETag,由於ETag值現在已過期,所以此操作失敗。 如何處理此故障取決於您的要求,但可能需要通知您的客戶端用戶由於其他用戶所做的更改而導致操作失敗;用新的ETag重新讀取最新的記錄狀態([A',B',C',A'',B'']);然後用戶可以根據我的理解修改([A',B',C',A',B',C'']])。