簡體   English   中英

並發寫入 GAE 數據存儲實體的不同屬性

[英]Concurrent writes to different properties of GAE Datastore Entity

我正在使用 Java 風格的 Google Appengine,我正在嘗試執行以下操作:

1 - 創建一個屬性 COUNT 為 0 的實體。

2a - 啟動執行某些網絡調用的任務隊列任務,並更新同一實體的 STATUS 屬性(使用Datastore#put

2b - 同時,在原始“線程”中,為 COUNT 保存一個不同的數字。 (也使用Datastore#put

鑒於2a2b可能在完全相同的時刻並行完成,但它們更新兩個不同的屬性( STATUSCOUNT ),它們是否會像並發修改異常一樣發生沖突或拋出?

正如 Igor Artamonov 評論的那樣,僅更改實體的一個屬性仍然需要重新編寫整個實體。 考慮到這一點,您正在查看 2 個實體寫入,它們必須在事務內部完成以防止相互覆蓋。

如果與 2a 中入隊任務關聯的事務在提交 2b 事務之前開始,則您描述的流程將導致事務沖突。

2a 任務執行被延遲 - 它會是稍后發送到您的應用程序的請求(實際延遲取決於您的應用程序此時的負載及其可擴展性配置)。 它可以有很多長於2B執行。 或者它可能很小,允許 2a 在 2b 結束之前開始。

我建議更改操作的順序以使其更具可預測性,並且作為副作用,最大程度地減少事務沖突/重試的機會:

  • 在當前請求線程上執行 2b(在一個事務中)
  • 在同一個事務中, 事務性地將 2a 任務排入隊列,這應該僅在 2b 成功后發生。 否則,您需要注意在 2b 重試期間可能將多個 2a 任務排入隊列。

暫無
暫無

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

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