考虑“用于事务”中的第二个示例(“使用命名键更新实体,或者如果它尚不存在则创建它”):
https://developers.google.com/appengine/docs/java/datastore/transactions
现在考虑这种情况。多人游戏只允许任何两个玩家之间进行单场比赛。为确保这一点,使用玩家的每个键创建一个键。此键用作 UniqueMatch 实体的键。
因此,为了创建匹配,创建了 XG 交易。在本次交易中:
我们检查是否已经没有具有该键的 UniqueMatch 实体。如果使用该键的 datastore.get() 调用没有抛出 EntityNotFoundException,那么我们知道这两个玩家之间已经存在匹配,所以我们 rollback() 并向玩家显示错误消息。
我们 put() 我们需要放置的所有实体以创建匹配。这包括 UniqueMatch 实体,以及其他一些实体。
然后提交事务。
这似乎工作正常。但是,我注意到我可以在短时间内在任意两个玩家之间创建两场比赛。在一小段时间(实际上,在其中一个测试中长达 10-20 秒),我对 datastore.get(key) 的调用会抛出 EntityNotFoundException,即使该键已经被 put()。
这似乎是最终的一致性。但是,实体检索键是否保证是强一致的?这种保证是否受到在 XG 交易中完成这一事实的影响?
提前致谢,