2010-10-24 2 views
4

J'insère un ensemble d'enregistrements sur Google App Engine. Je les insère par lot pour éviter les exceptions d'échéance.Collision de transaction pour insertion séquentielle sur Google App Engine. Pourquoi?

Quand il y a un grand nombre d'enregistrements (par exemple 1K) Je reçois toujours un inattendu:

collision de transaction pour le groupe d'entités avec la clé

datastore_types.Key.from_path (u'GroupModel ', u'root', _app = u'txttomail '). Réessayer ...

Cette situation se produit toujours.

Dans un environnement local, cela fonctionne sans aucun problème.

Comment est-il possible d'avoir des collisions de transactions si j'utilise un processus séquentiel et que personne n'utilise le système entre-temps?

Voici le code que j'utilise pour batching:

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

où, en * process_chunk() * Je fais 50 insertions dans la base de données

+1

Comment insérez-vous 1 000 entités dans un lot? Il existe une limite de 500 entités (http://code.google.com/appengine/docs/python/datastore/overview.html#Quotas_and_Limits). Publiez du code, et dites-nous si vous faites quoi que ce soit en utilisant différé ou des tâches. –

+0

Pouvez-vous poster votre code? –

Répondre

2

La collision est sur une instance de votre 'GroupModel' entité avec le nom de clé 'root'. Sur cette base, je suppose que vous mettez tout dans un seul groupe d'entité avec cela comme parent. Comme documenté here, chaque entité avec le même parent est dans le même groupe d'entité, à laquelle les transactions sont sérialisées. Ainsi, mises à jour simultanées à n'importe quelle entité dans ce groupe sera potentiellement en conflit avec tout autre.

+0

@Nick l'op dit que le processus est séquentiel; Comment une mise à jour simultanée pourrait-elle être possible dans ce cas? – systempuntoout

+0

@systempuntoout En effectuant plusieurs insertions séquentielles en même temps. –

+0

@Nick Voulez-vous dire qu'appeler à l'intérieur d'une boucle une méthode qui met à jour différentes entités avec le même parent en utilisant db.run_in_transaction, pourrait mener à ce genre de problème? – systempuntoout