数据存储区事务限制

时间:2009-05-07 20:55:49

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

在我的Google应用应用中,无论何时用户购买了多个合同,都会执行这些事件(为简洁起见而简化):

  • user.cash减少
  • user.contracts增加了数字
  • contracts.current_price已更新。
  • market.no_of_transactions增加1。
在rdms中,这些将放在同一个事务中。我认为谷歌数据存储区不允许多个模型的实体在同一个交易中。

这个问题的正确方法是什么?我如何确保如果写入失败,所有先前的写入都会回滚?

编辑:我显然错过了实体组。现在,我将了解有关如何使用它们的更多信息。澄清的另一点是谷歌说“只有在交易需要时才使用实体组。对于实体之间的其他关系,使用可以在查询中使用的ReferenceProperty属性和Key值”。这是否意味着我必须定义一个引用属性(因为我需要查询它们)和一个父子关系(对于事务)?

编辑2:最后,如果正在创建实体以在2个父母之间建立n对n关系,我如何为实体定义两个父母?

3 个答案:

答案 0 :(得分:0)

经过一番研究,我发现在一些谷歌人的帮助下,在用户空间开发了一个分布式事务层,为单个实体组限制提供了解决方案。但到目前为止,它还没有发布,只能在java中使用。

答案 1 :(得分:0)

让我添加Datastore documentation

的引用
  

实体组的一个好的经验法则是它们应该是关于的   单个用户的价值   数据或更小。

您可以创建一个伪根实体并将所有内容放在此下面。然后,您执行事务中的所有内容。

答案 2 :(得分:0)

shanyu,您提到了分布式事务层,它允许您在单个事务中跨任意多个实体组进行操作。它实际上 has been released,它只是没有大声宣传。它是由daniel wilkerson和erick armbrust设计和编写的,我有一些咨询。 dan在this talk中描述了它。

尼克约翰逊也曾形容 how to do "transfer" type operations across entity groups,与您描述的类似。它不像木薯粉一般通用,但它更简单,重量更轻。

有一个相关的内置功能transactional tasks,它允许您将任务添加到数据存储区事务中的队列,这样只有在事务成功提交时才会添加该任务。然后,该任务可以执行更多数据存储操作,包括不同实体组上的事务。它不像dan和erick的解决方案那么强大,但它确实为您提供了跨实体组的最终一致性,这对于许多用例来说已经足够了,而且没有额外的开销。

回答您的问题:1)您不需要同时使用引用属性和父/子关系(即实体组)。该指南仅表示实体组限制数据存储写入吞吐量,因为写入是按实体组序列化的。如果您考虑将数据结构化为实体组,只是为了祖先查询,您应该知道这一点。

2)实体不能有多个父母。如果要建模多对多关系,通常应使用ListProperty的引用属性(即键)。有关详细信息,请参阅this articlethis talk