我正在开发Windows Azure上网站的Node.js应用程式(IISNode),并已安装了node.js的在Azure SDK模块我的问题是如何使用表存储的eTag或时间戳字段。
是不是因为“我”做一些如一个问题:
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(...的错误返回一个错误返回什么?
任何帮助或建议赞赏
正如尼尔提到的好的做法是让台服处理并发相关的东西。
当我们使用客户端库从表服务获取实体,库将存储与所述实体(其存在于从该实体的服务的响应)在EntityDescriptior实例(EntityDescriptor是通过为库维护的对象相关联的ETag的在上下文中的每个实体实例)
当您提交请求,以更新的实体,SDK将准备HTTP请求与身体作为实体序列化到该请求为存储在对应于该实体的实体描述符中的ETag值的XML和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, e.g. 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,可以使用通过允许您specigy的更新应该不管另一个线程是否已更新记录成功修改这个行为 - 从而覆盖乐观并发。
在Windows Azure存储服务REST API是明确的界面到Windows Azure存储,并htis是去当你想了解该服务的API功能的文档。 该机制的文档描述ETag的,一般是在这里 。