【问题标题】:On the google app engine, how do I implement database Transactions?在谷歌应用引擎上,如何实现数据库事务?
【发布时间】:2011-01-01 04:47:12
【问题描述】:

我知道在应用引擎上处理数据库事务的方法是给不同的实体相同的Parent(实体组)并使用db.run_in_transaction

但是,假设我能够为两个实体提供相同的父级。如何确保我的数据库更新发生在事务中?

有技术解决方案吗?如果没有,有没有我可以应用的模式?

注意:我使用的是 Python。

【问题讨论】:

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


    【解决方案1】:

    只要实体属于同一个组,这不是问题。来自docs

    所有数据存储操作都在一个 交易必须对实体进行 在同一个实体组中。这 包括通过以下方式查询实体 祖先,按键检索实体, 更新实体和删除 实体。请注意,每个根实体 属于一个单独的实体组,所以 单个事务不能创建或 对多个根实体进行操作。 对于实体组的解释, 请参阅键和实体组。

    还有一篇关于Transaction Isolation in App Engine的好文章。

    编辑:如果您需要在同一事务中更新具有不同父级的实体,您将需要实现一种方法来序列化您所做的更改并在引发异常时手动回滚.

    【讨论】:

    • 但是如果你点击“键和实体组”链接到code.google.com/appengine/docs/python/datastore/…,列出的将两个实体放在同一个实体组中的唯一方法是确保它们共享一个祖先
    • 抱歉,从技术上讲,我指的是群组,而不是父母。但是,是的,根据我正在阅读的书,似乎在 python 中分配组的唯一方法是通过一个共同的祖先/父母。
    • @James @Willem 你们都是对的。仅当实体共享相同的根/父节点时,它们才被视为一个组。我已经编辑了我的答案。
    • 听起来我很不走运。我将不得不构建自定义事务处理代码,或者更改我的域,以便实体可以属于同一个组。我认为后一种选择更简单(但更丑)。
    【解决方案2】:

    如果您想要跨实体组事务,则必须自己实现它们,或者等待库来执行它们。我前段时间写了an article,讲的是如何在“银行转账”的情况下实现跨实体组交易;它也可能适用于您的用例。

    【讨论】:

      【解决方案3】:

      AppEngine 数据存储中的事务与您在 SQL 数据库中可能习惯的事务不同。一方面,事务实际上并没有锁定它正在操作的实体。

      Translation Isolation in App Engine 文章对此进行了更详细的解释。

      因此,您会希望对交易有不同的看法 - 您可能会发现,在大多数情况下,如果您想要使用交易,它要么是不必要的 - 要么无法实现您想要的.

      有关实体组和数据存储模型的更多信息,请参阅How Entities and Indexes are Stored

      Handling Datastore Errors 谈论可能导致事务无法提交的事情以及如何处理这些问题。

      【讨论】:

        【解决方案4】:

        如您所述,一种可能性是实现您自己的事务处理。如果您正在考虑这样做,那么值得您花时间探索以前在此问题上的工作。

        http://danielwilkerson.com/dist-trans-gae.html

        Dan Wilkerson 也在 Google IO 上发表了演讲。你应该可以找到演讲的视频。

        【讨论】:

          【解决方案5】:

          erick armbrust 实现了前面提到的 daniel wilkerson 的分布式事务设计,在 java 中:http://code.google.com/p/tapioca-orm/

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-05-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多