java – GAE HDR:通过密钥实体检索是否最终在XG事务中保持一致
考虑“用于事务的”中的第二个示例(“使用命名键更新实体,如果尚不存在则创建”):
https://developers.google.com/appengine/docs/java/datastore/transactions 现在考虑这种情况.多人游戏只允许任何两个玩家之间的单一匹配.为了确保使用每个玩家的键创建一个键.该键用作UniqueMatch实体的键. 所以为了创建一个匹配,创建一个XG事务.在此交易中: >我们检查是否没有该密钥的UniqueMatch实体.如果使用该键的datastore.get()调用不会抛出EntityNotFoundException,那么我们知道这两个玩家之间的匹配已经存在,所以我们回滚()并向玩家显示一条错误消息. 这似乎工作正常.不过,我注意到我可以在短时间内任意两个球员之间创造两场比赛.在一段时间内(其中一个测试中最多可达10-20秒),我的datastore.get(key)调用即使该键已经被put())抛出EntityNotFoundException. 这似乎是最终的一致性.但不是按实体重组的关键保证是坚定一致的?这个保证是否受到XG交易中的这一事实的影响? 提前致谢, 解决方法
我认为您看到的问题可能是因为数据存储获取(按键或查询)只能在事务开始时看到数据存储的状态.
从docs(隔离和一致性):
另外,在交易之外,您只会看到已经提交的投注(docs):
一个可能的解决方案: 在事务外部创建UniqueMatch实体(appengine将不允许您将具有相同密钥的实体放在一起,因此如果具有相同密钥的实体已存在,则会抛出异常).然后,您可以创建/放置在事务中创建匹配所需的其他实体(如果需要). 最后,确保在创建UniqueMatch的键时,他们的键总是以相同的顺序由玩家创建,因为key(playerA,playerB)!= key(playerB,playerA) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |