0

我正在做一个项目,我有一种情况,我发送一个 POST 请求,这是一个事务(必须要求)。在 POST 请求之后,我立即重定向到一个页面,我必须在该页面中获取相同的数据,但我正在取回旧数据。有没有办法让我的 GET 请求等到事务完成。我不想使用任何 hacky 解决方案,例如sleep()

4

2 回答 2

2

这似乎是学术示例异步编程。您没有提到您正在使用的任何特定技术,但它在所有常用的编程语言中都可用。JS 中已知的 Promise 机制可能就是一个很好的例子。如果您对此一无所知,您可以谷歌搜索"Asynchronous Programming" + <your technology>。当谈到数据存储时,Google 为 node.js、java 和 python 等提供了很多不错的 API。您可以在这里查看https://cloud.google.com/datastore/docs/reference/libraries

于 2019-11-29T08:06:24.497 回答
1

我想你的 POST 处理程序不仅仅是在事务中启动数据存储异步操作并在不等待它们完成的情况下返回(这是可能的,但很可能会破坏首先使用事务的目的)。换句话说,您的问题实际上与 POST 请求处理程序执行完成时尚未完成的事务(或者更确切地说事务试图实现的目标)无关。

如果您的 GET 请求处理程序通过常规查询获取数据,它可能会错过来自 POST 请求处理程序的更新,原因有两个:

  1. 数据存储最终一致性
  2. 更改传播到查询使用的数据存储索引所需的(未指定)时间量

解决第一个问题的典型方法是将 GET 处理程序查询修改为keys_only查询,然后通过直接键查找获取实际实体内容,这是强一致的。但是,如果您的应用程序对第​​二个问题也很敏感(例如,如果预期的实体键甚至不存在于返回的键列表中),那么这是没有用的。

我认为可以解决第二个问题的唯一方法是将足够的信息(来自 POST 请求处理程序)传递给 GET 请求处理程序,以允许它在不使用查询的情况下获取数据(或纠正/完成潜在的从查询中获得的陈旧信息,但这不是微不足道的)。例如传递事务中更新的实体的密钥或密钥 ID。通过一些用户会话数据或作为请求参数。或通过 memcache(但请记住,memcache 信息可能随时消失,因此这可能不适用于所有情况)

于 2019-12-23T07:32:35.670 回答