2011-12-26 133 views
0

在天蓝色表中存储。有没有办法在更新或插入后获取新的时间戳值。我正在编写一个3阶段提交协议来获取表存储以支持分布式事务,并且它将多次写入同一个实体。所以操作顺序是这样的,Read Entity,Write Entity (Lock Item),Write Entity (Commit new values)。我希望在锁定项目操作之后获得新的时间戳,这样在执行提交新值操作之前,我不必再次不必要地读取该项目。那么是否有人知道如何在savechanges操作之后有效地获取新的时间戳值?插入/更新后获取时间戳

回答

1

我不认为你需要做任何特别/额外的事情。当你读你的实体时,你会得到一个Etag。当您保存该实体(设置someLock = true)时,只有在没有其他人自您读取之后更新实体时,保存才会成功。因此,你知道你有锁。然后你可以随心所欲地做第二次写作。

0

我不相信这是可能的。我会用你自己的时间戳和/或guid来标记条目。

+0

所有我想做的事情两个写一个接一个,第一次锁定,然后下一次提交。我想在没有任何阅读的情况下做到这一点。额外的字段不会帮助我防止额外的读取。有什么建议么? – RyanFishman 2011-12-26 20:00:41

+0

对不起,我以为你试图通过做时间戳比较来防止他人写同一个实体。你能详细说明为什么你需要知道插入后的时间戳吗? – Igorek 2011-12-27 00:52:55

+0

我为Azure表存储实现了我自己的分布式事务方法,因为表存储本身不支持它(我不知道为什么它不?)。我正在对同一实体执行2次写入操作。第一次写入是一个锁,我基本上将一些属性调用IsLocked设置为true。如果成功成功,那么所有其他角色将知道不要写入该元素,因为其他角色当前有锁定。一旦我获得锁定并锁定了分布式事务中涉及的所有必需行,我就可以继续对实体进行更改。 – RyanFishman 2011-12-27 01:00:11

0

如果您愿意回到Update REST API call,它会返回生成响应的时间。它可能不会与记录上的时间戳完全一样,但我相信它会接近。

+0

如果不是确切的,那么由于乐观并发会导致第二次更新失败,是否也可以绕过乐观并发?这也将起作用,因为当我获得锁定时,我可以保证没有其他进程会尝试更新实体。 – RyanFishman 2011-12-26 20:22:30

+0

好吧,为了忽略表存储的乐观并发性,而不是像这样更新一个值 – RyanFishman 2011-12-26 22:14:56

0

您可能需要破解Azure表。驱动程序

例如,在Azure python lib(TableStorage)中,Timestamp简单地被跳过。

# exclude the Timestamp since it is auto added by azure when 
    # inserting entity. We don't want this to mix with real properties 
    if name in ['Timestamp']: 
     continue