2017-04-04 67 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'']])。