- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
考虑“事务用途”中的第二个示例(“使用命名键更新实体,如果它尚不存在则创建它”):
https://developers.google.com/appengine/docs/java/datastore/transactions
现在考虑这个场景。多人游戏只允许任何两个玩家之间进行一场比赛。为确保这一点,使用播放器的每个键创建一个键。此键用作 UniqueMatch 实体的键。
因此,为了创建匹配,创建了 XG 交易。在此交易中:
我们检查是否不存在具有该键的 UniqueMatch 实体。如果使用该键的 datastore.get() 调用没有抛出 EntityNotFoundException,那么我们就知道这两个玩家之间的匹配已经存在,因此我们回滚 () 并向玩家显示一条错误消息。
我们 put() 我们需要放置的所有实体以创建匹配。这包括 UniqueMatch 实体以及其他一些实体。
然后提交事务。
这似乎工作正常。但是,我注意到我可以在很短的时间内在任意两名玩家之间创建两场比赛。在一小段时间内(实际上在其中一个测试中长达 10-20 秒),我对 datastore.get(key) 的调用抛出 EntityNotFoundException,即使该键已经被 put()。
这似乎是最终一致性。但是实体检索不是按键保证高度一致吗?这是在 XG 交易中完成的事实是否会影响此保证?
提前致谢
最佳答案
我认为您看到的问题可能是因为数据存储获取(通过键或查询)仅在事务的开始时看到数据存储的状态。
来自docs (在隔离和一致性下):
In a transaction, all reads reflect the current, consistent state of the Datastore at the time the transaction started. This does not include previous puts and deletes inside the transaction. Queries and gets inside a transaction are guaranteed to see a single, consistent snapshot of the Datastore as of the beginning of the transaction.
此外,在事务之外,您只会看到已提交的放置 (docs):
Entities retrieved from the datastore by queries or gets will only see committed data.
可能的解决方案:
在事务之外创建 UniqueMatch 实体(appengine 不允许您放置具有相同键的实体,因此如果具有相同键的实体已存在,它会抛出异常)。然后,您可以创建/放置在交易中创建匹配所需的其他实体(如果需要)。
最后,确保在为 UniqueMatch 创建 key 时,他们的 key 始终以相同的顺序与玩家一起创建,因为 key(playerA,playerB)!=key(playerB,playerA)
关于java - GAE HDR : Are entity retrievals by key eventually consistent within a XG transaction?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12784441/
查看“mysqldump -d”并看到一个键是 KEY,而不是“PRIMARY KEY”或“FOREIGN KEY” 什么是关键? 示例: CREATE TABLE IF NOT EXISTS `TA
在我开始使用 Python 的过程中尝试找出最佳编码实践。我用 Pandas 写了一个 csv 到数据框阅读器。它使用格式: dataframe = read_csv(csv_input, useco
在 Flutter 中,用一个例子可以清楚地解释什么? 我的困惑是关于 key,如下面的代码所示。 MyHomepage({Key key, this.title}) : super(key: key
我在我的 Android 应用程序中使用 GCM。要使用 GCM 服务,我们需要创建 Google API key 。因此,我为 android、服务器和浏览器 key 创建了 API key 。似乎
我想在 azure key 保管库中创建一个 secret ,该 key 将具有多个 key (例如 JSON)。 例如- { "storageAccountKey":"XXXXX", "Co
尝试通过带有 encodeforURL() 的 url 发送 key 时,我不断收到错误消息和 decodefromUrl() .代码示例如下。 这是我的入口页面: key = generateSec
是否有检查雪花变体字段中是否存在键的函数? 最佳答案 您可以使用 IS_NULL_VALUE 来查看 key 是否存在。如果键不存在,则结果将为 NULL。如果键存在,如果值为 JSON null,则
我正在尝试运行此命令: sudo apt-key adv --keyserver keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A 但我收到一个错误: Execu
我有一个 csv 文件,我正在尝试对 row[3] 进行计数,然后将其与 row[0] 连接 row[0] row[3] 'A01' 'a' 'B02'
如何编写具有这种形式的函数: A(key, B(key, C(key, ValFactory(key)))) 其中 A、B 和 C 具有此签名: TResult GetOrAdd(string key
审查 this method我很好奇为什么它使用 Object.keys(this).map(key => (this as any)[key])? 只调用 Object.keys(this).ind
我有一个奇怪的情况。我有一个字典,self.containing_dict。使用调试器,我看到了字典的内容,并且可以看到 self 是其中的一个键。但是看看这个: >>> self in self.c
我需要在我的 Google Apps 脚本中使用 RSA-SHA256 和公钥签署消息。 我正在尝试使用 Utilities.computeRsaSha256Signature(value, key)
我是 React 的初学者开发人员,几天前我看到了一些我不理解的有趣语法。 View组件上有{...{key}},我会写成 key={key} ,它完全一样吗?你有链接或解释吗? render()
代理 key 、合成 key 和人工 key 之间有什么区别吗? 我不清楚确切的区别。 最佳答案 代理键、合成键和人工键是同义词。技术关键是另一个。它们都表示“没有商业意义的主键”。它们不同于具有超出
问题陈述:在 Web/控制台 C# 应用程序中以编程方式检索并使用存储在 Azure Key Vault 中的敏感值(例如数据库连接字符串)。 据我所知,您可以在 AAD 中注册应用,并使用其客户端
问题陈述:在 Web/控制台 C# 应用程序中以编程方式检索并使用存储在 Azure Key Vault 中的敏感值(例如数据库连接字符串)。 据我所知,您可以在 AAD 中注册应用,并使用其客户端
我正在寻找 Perl 警告的解决方案 “引用键是实验性的” 我从这样的代码中得到这个: foreach my $f (keys($normal{$nuc}{$e})) {#x, y, and z 我在
我正在为 HSM 实现 JCE 提供程序 JCE中有没有机制指定 key 生成类型例如: session key 或永久 key KeyGenerator keygen = KeyGener
我在 Facebook 上创建了一个应用程序。我已经正确添加了 keyhash 并且应用程序运行良好但是当我今天来并尝试再次运行它时它给了我这个错误。 这已经是第二次了。 Previsouly 当我收
我是一名优秀的程序员,十分优秀!