【问题标题】:Transaction collision for sequential insert on Google App Engine. Why?Google App Engine 上顺序插入的事务冲突。为什么?
【发布时间】:2010-10-24 09:07:30
【问题描述】:

我正在 Google App Engine 上插入一组记录。我将它们批量插入以避免截止日期异常。

当有大量记录(例如 1k)时,我总是会收到意外消息:

实体组的事务冲突 用钥匙

datastore_types.Key.from_path(u'GroupModel', u'root',_app=u'streamtomail')。 正在重试...

这种情况总是会发生。

在本地环境中,它可以正常工作。

如果我使用的是顺序进程而同时没有人使用系统,怎么可能发生事务冲突?

这是我用于批处理的代码:

def deferred_worker():
 if next_chunk():
   process_chunk()
   deferred.defer(deferred_worker)

在 *process_chunk()* 我在数据库中做了 50 次插入

【问题讨论】:

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


【解决方案1】:

冲突发生在键名为“root”的“GroupModel”实体的实例上。基于此,我猜您将所有内容都放在一个实体组中,并将其作为父项。正如here 所记录的那样,具有相同父级的每个实体都在同一个实体组中,事​​务被序列化到该实体组中。因此,任何对该组中任何实体的并发更新都可能与任何其他实体发生冲突。

【讨论】:

  • @Nick op 说这个过程是顺序的;在那种情况下怎么可能同时更新呢?
  • @systempuntoout 通过同时进行多个顺序插入。
  • @Nick 你是说,在循环内调用使用 db.run_in_transaction 更新具有相同父级的不同实体的方法会导致这种问题吗?
  • @systempuntoout 是的,这是正确的 - 正如文档所述,具有相同父级的所有实体都在同一个实体组中,并且对单个实体组的所有修改都是序列化的。
  • @systempuntoout 未捕获的异常并不是唯一会导致任务重新执行的事情。虽然很少见,但任务队列可以多次执行任务,这不是你自己的错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-26
  • 1970-01-01
  • 2020-08-13
相关资源
最近更新 更多