如何使用Windows Azure表存储时间戳或Etag字段

我正在Windows Azure网站(IISNode)上开发Node.js应用程序,并且已经为node.js安装了Azure SDK模块,我的问题是如何在表存储中使用etag或timestamp字段。

这是一个“我”做某事的问题,例如:

if (entities[0].Timestamp == newEntity.Timestamp) // commit this update because we are dealing with the latest copy of this entity else // oops! one of the entities is newer than the other, better not save it 

或者我需要监听由tableService.updateEntity(…返回的错误或什么?

任何帮助或build议表示赞赏

Neil提到的好的做法是让表服务处理并发相关的东西。

当我们使用客户端库从表服务中获取实体时,库将在EntityDescriptior实例中存储与实体相关联的ETag(存在于实体服务的响应中)(EntityDescriptor是由库维护的对象)上下文中的每个实体实例)

当您提交更新实体的请求时,sdk将准备HTTP身份验证请求,并将身份作为实体序列化为请求的XML和ETag头,作为存储在实体对应的实体描述符中的ETag值。

当表服务收到这个更新实体实例的请求时,它检查请求中的ETag是否与当前与表存储中的实体相关联的ETag相匹配(如果发生其他更新,与存储在服务中的实体相关联的ETag在收到您的更新请求之前),如果它不匹配服务返回前提条件失败/冲突错误,通过设置响应412或409中的HTTP状态代码。

 bool done = true; while (!done) { Stat statistics = _context.Execute<Stat>(new Uri("https://management.core.windows.net/<subscription-id>/services/storageservices/StatEntity?RowKey=..&PartitionKey=..").FirstOrDefault(); try { // TODO: Update the entity, eg statistics.ReadCount++ _context.UpdateObject(statistics); _context.SaveChanges(); // success break; } catch (DataServiceRequestException exception) { var response = exception.Response.FirstOrDefault(); if (response != null && (response.StatusCode == 412 || response.StatusCode == 409)) { // Concurrency Exception - Entity Updated in-between // by another thread, Fetch the latest _stat entity and repeat operation } else { // log it and come out of while loop break; } } catch (Exception) { // log it and come out of while loop break; } } 

ETag用于更新期间的乐观并发。 ETag会在您检索实体时自动设置,并在您更新查询的实体时自动上传。 如果实体同时被另一个线程更新,则更新将失败。 updateEntity方法有一个可选参数checkEtag,它可以用来修改这个行为,允许你指定更新应该成功,而不管另一个线程是否已经更新了记录 – 从而重写了乐观并发。

Windows Azure存储服务REST API是Windows Azure存储的权威接口,当您想了解服务的API功能时,htis是需要使用的文档。 一般来说,描述ETag的文档就在这里 。