簡體   English   中英

等待 NDB 中的事務完成

[英]Waiting till a transaction completes in NDB

我正在做一個項目,我有一種情況,我發送一個 POST 請求,這是一個事務(必須要求)。 在 POST 請求之后,我立即重定向到一個頁面,我必須在其中獲取相同的數據,但我正在取回舊數據。 有沒有辦法讓我的 GET 請求等到事務完成。 我不想使用任何 hacky 解決方案,如sleep()

這似乎是異步編程的學術示例。 您沒有提到您正在使用的任何特定技術,但它在所有常用的編程語言中都可用。 JS 中已知的 Promise 機制可能是一個很好的例子。 如果你對此一無所知,你可以在谷歌上搜索"Asynchronous Programming" + <your technology> 說到數據存儲,谷歌為 node.js、java 和 python 等提供了很多不錯的 API。 你可以在這里查看https://cloud.google.com/datastore/docs/reference/libraries

我想您的 POST 處理程序不只是在事務中啟動數據存儲異步操作並在不等待它們完成的情況下返回(這是可能的,但很可能首先會破壞使用事務的目的)。 換句話說,您的問題實際上與 POST 請求處理程序執行完成時未完成的事務(或者更確切地說是事務試圖實現的目標)無關。

如果您的 GET 請求處理程序通過常規查詢獲取數據,它可能會錯過來自 POST 請求處理程序的更新,原因有兩個:

  1. 數據存儲的最終一致性
  2. 將更改傳播到查詢使用的數據存儲索引所需的(未指定)時間量

解決第一個問題的典型方法是將 GET 處理程序查詢修改為keys_only查詢,然后通過直接鍵查找來獲取實際的實體內容,這是強一致的。 但如果您的應用對第二個問題也很敏感(例如,如果預期的實體密鑰甚至不存在於返回的密鑰列表中),這將毫無用處。

我認為可以解決第二個問題的唯一方法是將足夠的信息(從 POST 請求處理程序)傳遞給 GET 請求處理程序,以允許它在不使用查詢的情況下獲取數據(或更正/完成潛在的從查詢中獲得的陳舊信息,但這不是微不足道的)。 例如,傳遞交易中更新的實體的密鑰或密鑰 ID。 通過一些用戶會話數據或作為請求參數。 或者通過 memcache(但請記住,memcache 信息隨時可能消失,因此這可能並非在所有情況下都有效)

暫無
暫無

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

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