2010-10-24 1 views
4

Я вставляю набор записей в Google App Engine. Я вставляю их в пакет, чтобы исключить исключения по крайним срокам.Коллизия транзакций для последовательной вставки в 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 вставки в базе данных

+1

Как вы вставляете 1000 объектов в пакет? Существует ограничение на 500 сущностей (http://code.google.com/appengine/docs/python/datastore/overview.html#Quotas_and_Limits). Отправьте некоторый код и сообщите нам, если вы делаете что-либо, используя отложенные или задачи. –

+0

Можете ли вы разместить свой код? –

ответ

2

Столкновения на примере вашего «GroupModel» объект с ключевым именем «root». Исходя из этого, я предполагаю, что вы помещаете все в одну группу сущностей вместе с родительским. Как указано в документе here, каждый объект с одним и тем же родителем находится в той же группе сущностей, к которой транслируются транзакции. Таким образом, любые одновременные обновления любому объекту в этой группе потенциально конфликтуют с любым другим.

+0

@ Ник оп говорит, что процесс последователен; как могло бы быть возможно одновременное обновление в этом случае? – systempuntoout

+0

@systempuntoout Выполнение нескольких последовательных вставок в одно и то же время. –

+0

@Nick Вы говорите, что, вызывая внутри цикла метод, который обновляет разные объекты с одним и тем же родителем, используя db.run_in_transaction, может привести к этой проблеме? – systempuntoout