【问题标题】:On the google app engine, why do updates not reflect in a transaction?在谷歌应用引擎上,为什么更新不反映在交易中?
【发布时间】:2010-07-28 05:06:06
【问题描述】:

我将实体组存储在具有相同祖先/父级/实体组的谷歌应用引擎数据存储中。这样就可以在一个原子数据存储事务中更新实体。

问题如下:

  1. 我开始一个数据库事务
  2. 我通过设置 entityX.flag = True 来更新 entityX
  3. 我保存 entityX
  4. 我查询 flag == True 的实体。但是,这就是问题所在。此查询不返回任何结果。它应该返回 entityX,但它没有。

当我删除事务时,我的代码运行良好,所以一定是事务导致了这种奇怪的行为。

实体组中实体的更新是否应该在同一事务的其他地方不可见?

PS:我正在使用 Python。 GAE 告诉我我不能使用嵌套事务:(

【问题讨论】:

    标签: python google-app-engine


    【解决方案1】:

    App Engine 的事务是这样设计的,即事务中的读取会看到事务开始时的快照,因此它们看不到事务中先前写入的结果:

    http://code.google.com/appengine/docs/python/datastore/transactions.html#Isolation_and_Consistency

    【讨论】:

    • 感谢撒克逊人。现在我知道交易是专门设计的。我会调整我的代码。谢谢!
    【解决方案2】:

    看起来您在查询之前没有对事务进行提交

    1. 启动数据库事务
    2. 通过设置 entityX.flag = True 来更新 entityX
    3. 保存实体X
    4. 提交交易
    5. 查询标志 == True 的实体。但是,这就是问题所在。此查询不返回任何结果。它应该返回 entityX,但它没有。

    在事务中,实体在事务提交之前不会被持久化

    【讨论】:

    • 可能。问题是我不能使用嵌套事务。所以我必须使用两个事务,以便提交第一个事务,但这违背了尝试进行单个原子更新的目的:/
    • 谢谢奈库斯。但据我所知,GAE API 的 python 版本不提供中途提交事务的方法,因为您没有传递任何事务对象。我假设您使用的是 Java 版本?
    • 你是对的,但在那种情况下,你为什么要在提交之前查询实体?在这种情况下,您已经拥有该实体的最新状态。
    • @willem 不客气,你猜对了我正在使用 GAE Java :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 2012-05-01
    • 1970-01-01
    相关资源
    最近更新 更多