在我的google应用程序中,每当用户购买多个合同时,都会执行这些事件(为了清晰起见简化):
在rdms中,这些内容将放在同一个事务中。我认为google数据存储不允许一个以上模型的实体在同一个事务中。
对这个问题,正确的做法是什么?如何确保如果写入失败,所有前面的写入都回滚?
编辑:我显然错过了实体组。现在,我希望了解更多关于它们是如何使用的信息。另一点需要澄清的是,谷歌表示“只有在事务需要时才使用实体组。对于实体之间的其他关系,可以使用ReferenceProperty属性和键值,这可以用于查询”。这是否意味着我必须同时定义引用属性(因为我需要查询它们)和父-子关系(用于事务)?
编辑2:最后,如果创建实体是为了在两个父母之间建立n到n的关系,那么如何定义一个实体的双亲?
发布于 2009-05-08 09:15:20
通过研究发现,在一些google用户的帮助下,已经在用户地开发了一个为单一实体组限制提供解决方案的分布式事务层。但是到目前为止,它还没有发布,而且只在java中可用。
发布于 2010-01-24 15:15:31
让我添加一个来自Datastore文档的引用
对于实体组来说,一个很好的经验法则是,它们应该与单个用户的数据值大小差不多或更小。
您可以创建一个伪根实体,并将所有内容放在此下面。然后,执行事务中的所有内容。
发布于 2011-01-25 21:08:12
shanyu,您提到了分布式事务层,它允许您在单个事务中任意地跨多个实体组操作。它实际上是已被释放,它只是没有被很大声地宣传。它是由daniel和erick设计和编写的,我有一些参考意见。丹在这次谈话中描述了它。
尼克约翰逊也描述了如何在实体组之间进行“传输”类型操作,类似于你所描述的。它的一般用途不如木薯,但它更简单,更轻的重量。
有一个相关的内置特性事务性任务,它允许您将任务添加到数据存储事务中的队列中,这样只有在事务成功提交时才会添加任务。然后,该任务可以执行更多的数据存储操作,包括不同实体组上的事务。它不像dan和erick的解决方案那么强大,但它确实保证了实体组之间的最终一致性,这对于许多用例来说都足够好,而不需要额外的开销。
在回答您的问题时: 1)不需要同时使用引用属性和父/子关系(即实体组)。这个准则仅仅意味着实体组限制了数据存储写入吞吐量,因为写入是每个实体组序列化的。如果您考虑为祖先查询将数据构造为实体组,您应该意识到这一点。
( 2)一个实体不能有一个以上的父母。如果您想要建模多到多的关系,通常应该使用引用属性的ListProperty (即键)。详细信息请参见这篇文章和这次谈话。
https://stackoverflow.com/questions/836992
复制相似问题