gpt4 book ai didi

java - GAE HDR : Are entity retrievals by key eventually consistent within a XG transaction?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:02:09 26 4
gpt4 key购买 nike

考虑“事务用途”中的第二个示例(“使用命名键更新实体,如果它尚不存在则创建它”):

https://developers.google.com/appengine/docs/java/datastore/transactions

现在考虑这个场景。多人游戏只允许任何两个玩家之间进行一场比赛。为确保这一点,使用播放器的每个键创建一个键。此键用作 UniqueMatch 实体的键。

因此,为了创建匹配,创建了 XG 交易。在此交易中:

  1. 我们检查是否不存在具有该键的 UniqueMatch 实体。如果使用该键的 datastore.get() 调用没有抛出 EntityNotFoundException,那么我们就知道这两个玩家之间的匹配已经存在,因此我们回滚 () 并向玩家显示一条错误消息。

  2. 我们 put() 我们需要放置的所有实体以创建匹配。这包括 UniqueMatch 实体以及其他一些实体。

  3. 然后提交事务。

这似乎工作正常。但是,我注意到我可以在很短的时间内在任意两名玩家之间创建两场比赛。在一小段时间内(实际上在其中一个测试中长达 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com