【问题标题】:Google datastore transaction when no entity group没有实体组时的 Google 数据存储事务
【发布时间】:2015-12-13 19:46:55
【问题描述】:

我有一个由用户组成的 KIND:

USER
    username<Key,String>
    friends <array of strings>

两个用户可以成为朋友(用户可以有很多朋友)。如果用户是朋友,则他们的两个用户名都在彼此的“朋友”属性中。因此,如果他们成为朋友,我需要将每个用户名插入到两个实体中,并保证它们都被插入,如果出现错误或其他情况,则应回滚(全有或全无操作)。从我的理解交易中读取 Google Datastore 内部的交易只能在实体组内完成。由于它们是两个 USER 实体,因此它们两者之间没有父/子关系,它们都是根实体。保证此操作通过的最佳方法是什么。如果用户被删除,同样的情况也适用,然后我需要从所有与被删除用户成为朋友的用户的所有 fiends 属性中删除该用户,我必须保证这一点。

【问题讨论】:

    标签: google-app-engine transactions google-cloud-datastore


    【解决方案1】:

    Datastore 支持涉及multiple entity groups 的事务。

    【讨论】:

    • 完美,这让我的建模变得更加容易!感谢您的链接!
    • 认为 XG 交易中的实体数量是有限制的。如果您有 100 个朋友,则不可能在单个事务中包装该数量的实体。在这种情况下,您需要使用前滚模型对管理一系列事务删除的单独控制活动进行建模。运行这是一个可重试的任务,它会跟踪它的进度,任何重试最终都会清除(删除)所有朋友引用。
    • @TimHoffman - 每个“友谊”只需要更新两个实体。
    • 好的,您将朋友限制在单个键列表中,这设置了某人可以拥有的朋友数量的上限。我在您的文档中错过了这一点。我在考虑更大的可能缩放。
    • 我也认为这不是最优模型。除了好友上限之外,它也很昂贵——每个新好友都需要更新两个 User 实体,这可能会产生大量写入成本,尤其是在 User 实体具有索引属性的情况下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 2021-01-17
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多