簡體   English   中英

GAE HDR:按鍵的實體檢索最終是否在XG事務中保持一致?

[英]GAE HDR: Are entity retrievals by key eventually consistent within a XG transaction?

考慮“使用事務”中的第二個示例(“使用命名密鑰更新實體,或者如果它尚不存在則創建它”):

https://developers.google.com/appengine/docs/java/datastore/transactions

現在考慮這種情況。 多人游戲只允許任何兩個玩家之間的單一匹配。 為了確保這一點,使用每個玩家的鍵創建一個鍵。 此鍵用作UniqueMatch實體的鍵。

因此,為了創建匹配,將創建XG事務。 在此交易中:

  1. 我們檢查是否已存在具有該密鑰的UniqueMatch實體。 如果使用該鍵的datastore.get()調用沒有拋出EntityNotFoundException,那么我們知道這兩個玩家之間的匹配已經存在,所以我們回滾()並向玩家顯示錯誤消息。

  2. 我們將()所有需要放入的實體放入以創建匹配項。 這包括UniqueMatch實體以及其他一些實體。

  3. 然后提交事務。

這似乎工作正常。 但是,我注意到我可以在短時間內在任意兩個玩家之間創建兩場比賽。 在一小段時間內(實際上其中一個測試中最多10-20秒),我對datastore.get(key)的調用拋出了EntityNotFoundException,即使該鍵已經被put()。

這似乎是最終的一致性。 但是關鍵的實體回顧不是保證強烈一致嗎? 此保證是否受到在XG交易中完成的事實的影響?

提前致謝,

我認為您遇到的問題可能是因為數據存儲區(通過密鑰或查詢)只能在事務開始時看到數據存儲區的狀態。

文檔 (隔離和一致性):

在事務中,所有讀取都反映了事務開始時數據存儲的當前一致狀態。 這不包括事務中的先前放置和刪除。 查詢和獲取事務內部保證在事務開始時看到數據存儲的單個一致快照。

此外,在交易之外,您只會看到已提交的看跌期權( docs ):

通過查詢或獲取從數據存儲區檢索的實體將僅查看已提交的數據。

可能的解決方案:

在事務之外創建UniqueMatch實體(appengine不允許您放置具有相同鍵的實體,因此如果具有相同鍵的實體已存在,則會拋出異常)。 然后,您可以創建/放置在事務內創建匹配所需的其他實體(如果需要)。

最后,確保在為UniqueMatch創建密鑰時,他們的密鑰總是以相同的順序創建,因為key(playerA,playerB)!=key(playerB,playerA)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM