【问题标题】:Does ndb.toplevel break transactions?ndb.toplevel 会破坏事务吗?
【发布时间】:2014-02-25 16:36:26
【问题描述】:

以下代码按预期工作,不会触发断言:

@ndb.transactional
@ndb.tasklet
def Foo():
  assert ndb.in_transaction()

以下代码中断,触发断言:

@ndb.transactional
@ndb.toplevel
def Foo():
  assert ndb.in_transaction()

我尝试用 ndb.transaction 调用或 ndb.transaction_async 调用替换装饰器,但都不起作用。

ndb.toplevel 和事务是否存在错误?

【问题讨论】:

  • ndb.toplevel 的唯一目的是设置一个新的默认上下文。所以我不明白ndb.transactional(ndb.toplevel(Foo()))的用法。为什么需要你创建一个事务然后删除它的上下文?

标签: python google-app-engine asynchronous transactions app-engine-ndb


【解决方案1】:

我发现问题在于两者都创建了新的上下文。 transactional 创建一个上下文并确保在其中发生的所有写入都是非冲突的。顶层创建一个上下文并确保在其中创建的所有期货都得到解决。

因此,顶层正在破坏事务的上下文。两者在当前的实现中无法结合使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 2016-08-12
    • 2010-11-04
    相关资源
    最近更新 更多