我遇到了一个问题。我必须在azure表中存储一个列表。我正在做的是将它序列化为一个字符串并存储它。现在,当我正在阅读那一行时,有些情况我没有获得更新的列表。因此,如果我们将任何项目添加到列表中,那么在阅读后,旧版本会丢失。之前有没有人遇到过这个问题,解决方法是什么。
详细说明我们有3个类,其中C扩展B,B扩展A. 现在B和C的任何对象也是A的对象。 现在假设我们将A的所有对象(包括B和c)保存为Azure Table的一列中的列表。对象的当前状态为[A',B',C',A''] 当我们有多个应用服务器时会发生问题。现在,Server1希望通过获取当前列表将B的实例添加到列表中,例如[A',B',C',A'']附加新实例,让我们说B' '制作它[A',B',C',A'',B''] 同时,Server2获取列表为[A',B',C',A'']并附加C''制作[[A',B',C',A''],C'']。 现在有关对象B''迷路了。 如何缓解这类问题。
我是usign dot net客户端库。 下面是相同的代码
TableOperation retrieveTypedInstancesOperation = TableOperation.Retrieve(partitionKey,RowKey); TableResult retrieveTypedInstancesResult = instancesTable.Execute(retrieveTypedInstancesOperation); 列表instanceLists = new List(); if(retrieveTypedInstancesResult.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);
答案 0 :(得分:0)
Azure表存储使用ETag属性来管理此方案。
您还没有提供代码,因此我们不知道您使用的客户端库。因此,您的问题的摘要答案是:
如果使用Replace
(Update
)操作,则需要在读取记录时获得的ETag值。如果ETag值在原始读取和更新之间发生了更改,则更新将失败。请注意,如果wilcard&#39; *&#39; *,则可以覆盖此行为。 value作为更新的ETag值提供。
如果使用InsertOrReplace
操作,则无论原始读取和当前操作之间是否有任何更改,都将替换记录。我的假设是你正在使用的操作。
如果您修改代码以使用替换操作,则上面的示例将变为:
服务器1&amp; 2阅读表格[A&#39;,B&#39;,C&#39;,A&#39;&#39;],返回两者的实体具有相同的ETag值。
服务器1发出包含原始ETag的Replace操作;这是成功的,并将字段修改为[A&#39;,B&#39;,C&#39;,A&#39;&#39;&#39;&#39;&#39;&#39;]并更改表格中的ETag值。
服务器2发出一个Replace操作,包括它读取的原始ETag,由于ETag值现已过期,因此失败。
如何处理此故障取决于您的要求,但您可能需要通知您的客户端用户由于其他用户所做的更改而导致操作失败;用新的ETag重新阅读最新的记录状态([A&#39;,B&#39;,C&#39;,A&#39;&#39;&#39;&#39;&#39;);然后,用户可以修改(到[A&#39;,B&#39;,C&#39;,A&#39;&#39;,B&#39;&#39;&#39;&#39;&#39;]为我解释是你的要求)。