2011-12-26 148 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