我只想谈一个问题。我得把一张单子放在蔚蓝的桌子上。我所做的就是将它序列化成一个字符串并存储它。现在,当我阅读那一行时,有些情况下我没有得到更新的列表。因此,如果我们添加任何要列出的项目,就会丢失旧的项目。以前有没有人遇到过这个问题,解决这个问题的方法是什么?
为了详细说明,假设我们有三个类,其中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',B',A‘,Server2得到列表作为A’,B',C',A'',并附加C'‘以生成[A',B’,C',C‘’。现在有关对象B'‘的信息丢失了。如何缓解这类问题。
我是点网络客户端库。下面是相同的代码
TableOperation retrieveTypedInstancesOperation = TableOperation.Retrieve<TypedInstancesRow>(partitionKey, RowKey);
TableResult retrievedTypedInstancesResult = instancesTable.Execute(retrieveTypedInstancesOperation);
List<string> instanceLists = new List<string>();
if (retrievedTypedInstancesResult.Result != null)
{
string instances = ((TypedInstancesRow)retrievedTypedInstancesResult.Result).Instances;
if (!String.IsNullOrEmpty(instances)) instanceLists = JsonConvert.DeserializeObject<List<string>>(instances);
}
instanceLists.Add(InstanceId);
hierarchy.PartitionKey = partitionKey;
hierarchy.RowKey =rowKey;
hierarchy.Instances = JsonConvert.SerializeObject(instanceLists);
TableOperation insertOperation = TableOperation.InsertOrReplace(hierarchy);
instancesTable.Execute(insertOperation);发布于 2017-04-07 19:25:20
Azure表存储使用ETag属性来管理此场景。
您没有提供代码,所以我们不知道您使用的是哪个客户端库。因此,对你的问题的一个简要回答是:
如果使用Replace (Update)操作,则需要读取记录时获得的ETag值。如果ETag值在原始读取和更新之间发生了更改,则更新将失败。注意,如果提供了一个wilcard '*‘值作为更新的ETag值,则可以重写此行为。
如果使用InsertOrReplace操作,则无论原始读取操作和当前操作之间是否有任何更改,记录都将被替换。这是我的假设,这是你正在使用的操作。
如果您修改代码以使用替换操作,则上面的示例将变成:
服务器1和2读取表A‘、B’、C‘、A',而返回给这两个表的实体具有相同的ETag值。
服务器1发出包含原始ETag的替换操作;这是成功的,并将字段修改为A‘、B’、C‘、A'’、B',并更改表中的ETag值。
服务器2发出一个替换操作,包括它读取的原始ETag,这失败了,因为ETag值现在过时了。如何处理此故障取决于您的需求,但您可能需要通知您的客户端用户操作由于另一个用户的更改而失败;重新读取最新的记录状态(A',B',C',A',B',B‘与新ETag);然后用户可以修改(A’,B‘,C',A'',B’,C‘,根据我的解释,这是您的要求)。
https://stackoverflow.com/questions/43199077
复制相似问题