代码之家  ›  专栏  ›  技术社区  ›  willem

在Google应用程序引擎上,如何实现数据库事务?

  •  5
  • willem  · 技术社区  · 15 年前

    我知道在应用程序引擎上处理DB事务性的方法是给不同的实体相同的 Parent (实体组)和使用 db.run_in_transaction .

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

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

    注意:我使用的是python。

    5 回复  |  直到 14 年前
        1
  •  5
  •   jbochi    15 年前

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

    中的所有数据存储操作 事务必须在实体上操作 在同一实体组中。这个 包括按查询实体 祖先,按键检索实体, 更新实体并删除 实体。注意每个根实体 属于单独的实体组,因此 单个事务无法创建或 在多个根实体上操作。 对于实体组的解释, 请参见键和实体组。

    还有一篇关于 Transaction Isolation in App Engine .

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

        2
  •  3
  •   Nick Johnson    15 年前

    如果您想要跨实体组事务,您必须自己实现它们,或者等待库来完成它们。我写 an article 不久前,关于如何在“银行转账”案例中实现跨实体集团交易;它可能也适用于您的用例。

        3
  •  2
  •   James Polley    15 年前

    appengine数据存储中的事务与SQL数据库中可能使用的事务的作用不同。首先,事务实际上并不锁定它正在操作的实体。

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

    因此,您需要对事务进行不同的思考——您可能会发现,在大多数情况下,如果您想要使用事务,那么它是不必要的——或者它不会实现您想要的。

    有关实体组和数据存储模型的详细信息,请参见 How Entities and Indexes are Stored .

    Handling Datastore Errors 讨论可能导致交易不被承诺的事情以及如何处理问题。

        4
  •  2
  •   Kris Walker    15 年前

    一种可能是实现您自己的事务处理,正如您所提到的。如果你正考虑这样做,那就值得你花时间去探索以前关于这个问题的工作。

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

    丹·威尔克森也在谷歌IO上对此进行了讨论。你应该能找到谈话的录像。

        5
  •  0
  •   ryan    14 年前

    埃里克.阿姆布拉斯已经在Java中实现了丹尼尔·威尔克森先前提到的分布式事务设计: http://code.google.com/p/tapioca-orm/