Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数据存储事务限制_Python_Google App Engine_Transactions_Google Cloud Datastore - Fatal编程技术网

Python 数据存储事务限制

Python 数据存储事务限制,python,google-app-engine,transactions,google-cloud-datastore,Python,Google App Engine,Transactions,Google Cloud Datastore,在我的google app应用程序中,每当用户购买多个合同时,都会执行这些事件(为清晰起见,将其简化): 用户。现金减少 user.contracts增加了个数 合同。更新当前价格 市场。交易数量增加1 在rdms中,这些将放在同一事务中。我认为google数据存储不允许多个模型的实体处于同一事务中 解决这个问题的正确方法是什么?如何确保在写入失败时回滚前面的所有写入 编辑:我显然错过了实体组。现在,我想了解更多关于如何使用它们的信息。另一点需要澄清的是,谷歌表示“仅在事务需要时使用实体组。

在我的google app应用程序中,每当用户购买多个合同时,都会执行这些事件(为清晰起见,将其简化):

  • 用户。现金减少
  • user.contracts增加了个数
  • 合同。更新当前价格
  • 市场。交易数量增加1
在rdms中,这些将放在同一事务中。我认为google数据存储不允许多个模型的实体处于同一事务中

解决这个问题的正确方法是什么?如何确保在写入失败时回滚前面的所有写入

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


编辑2:最后,如果一个实体是为了在两个父实体之间建立n对n关系而创建的,那么我如何为该实体定义两个父实体?

经过深入研究,我发现,在一些google人员的帮助下,userland开发了一个分布式事务层,它为单一实体组限制提供了解决方案。但到目前为止,它还没有发布,仅在java中可用。

让我添加以下内容的引用:

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


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

shanyu,您提到了分布式事务层,它允许您在单个事务中跨任意多个实体组进行操作。事实上 ,只是广告宣传的声音不够大。它是由丹尼尔·威尔克森(daniel wilkerson)和埃里克·阿姆布鲁斯特(erick Armburst)设计和编写的,我也做了一些咨询。丹用英语描述它

尼克·约翰逊也描述了 ,与你描述的相似。它不像木薯淀粉那样通用,但它更简单、更轻

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

回答您的问题:1)您不需要同时使用引用属性和父/子关系(即实体组)。该指导原则只意味着实体组限制了数据存储写入吞吐量,因为写入是按实体组序列化的。如果您正在考虑将数据结构化为实体组(仅用于祖先查询),那么您应该意识到这一点


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

@systempuntoot但我的意思是,您将在任务处理程序中,而不是在原始事务中写入不同的实体组。误解了,我的无用评论将在几分钟内消失:)。