Python 数据存储事务限制
在我的google app应用程序中,每当用户购买多个合同时,都会执行这些事件(为清晰起见,将其简化):Python 数据存储事务限制,python,google-app-engine,transactions,google-cloud-datastore,Python,Google App Engine,Transactions,Google Cloud Datastore,在我的google app应用程序中,每当用户购买多个合同时,都会执行这些事件(为清晰起见,将其简化): 用户。现金减少 user.contracts增加了个数 合同。更新当前价格 市场。交易数量增加1 在rdms中,这些将放在同一事务中。我认为google数据存储不允许多个模型的实体处于同一事务中 解决这个问题的正确方法是什么?如何确保在写入失败时回滚前面的所有写入 编辑:我显然错过了实体组。现在,我想了解更多关于如何使用它们的信息。另一点需要澄清的是,谷歌表示“仅在事务需要时使用实体组。
- 用户。现金减少
- user.contracts增加了个数
- 合同。更新当前价格
- 市场。交易数量增加1
编辑2:最后,如果一个实体是为了在两个父实体之间建立n对n关系而创建的,那么我如何为该实体定义两个父实体?经过深入研究,我发现,在一些google人员的帮助下,userland开发了一个分布式事务层,它为单一实体组限制提供了解决方案。但到目前为止,它还没有发布,仅在java中可用。让我添加以下内容的引用: 实体组的一个好的经验法则是它们应该是 单个用户价值的大小 数据或更小
您可以创建一个伪根实体并将所有内容放在下面。然后,您执行事务中的所有内容。shanyu,您提到了分布式事务层,它允许您在单个事务中跨任意多个实体组进行操作。事实上 ,只是广告宣传的声音不够大。它是由丹尼尔·威尔克森(daniel wilkerson)和埃里克·阿姆布鲁斯特(erick Armburst)设计和编写的,我也做了一些咨询。丹用英语描述它 尼克·约翰逊也描述了 ,与你描述的相似。它不像木薯淀粉那样通用,但它更简单、更轻 有一个相关的内置功能,允许您将任务添加到数据存储事务中的队列中,这样只有在事务成功提交时才会添加任务。然后,该任务可以执行更多的数据存储操作,包括不同实体组上的事务。它不像dan和erick的解决方案那样强大,但它确实保证了跨实体组的最终一致性,这对于许多用例来说已经足够好了,并且没有额外的开销 回答您的问题:1)您不需要同时使用引用属性和父/子关系(即实体组)。该指导原则只意味着实体组限制了数据存储写入吞吐量,因为写入是按实体组序列化的。如果您正在考虑将数据结构化为实体组(仅用于祖先查询),那么您应该意识到这一点
2) 一个实体不能有多个父实体。如果要对多对多关系建模,通常应使用引用属性(即键)的ListProperty。有关详细信息,请参阅和。@systempuntoot但我的意思是,您将在任务处理程序中,而不是在原始事务中写入不同的实体组。误解了,我的无用评论将在几分钟内消失:)。