繁体   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