2011-06-30 1 views

Répondre

5

Vous le ferez parfaitement, même dans l'éventualité peu probable où deux demandes seraient traitées exactement en même temps, en cas de conflit, ZODB lèverait une ConflictError et réessayerait votre requête.

En réponse à la discussion ci-dessous:

Sur un seul ordinateur puis par defition les deux opérations doivent se chevaucher (vous avez obtenu le même résultat de time.time() dans chaque thread.) ZODB est MVCC, de sorte que chaque fil voit une vue cohérente de la base de données telle qu'elle était au début de la transaction. Lorsque le deuxième thread valide, une erreur de conflit est déclenchée car il écrira sur un objet qui a été modifié depuis le début de la transaction.

Si vous avez des clients fonctionnant sur plusieurs ordinateurs, vous devez penser à la possibilité de dérive de l'horloge entre les clients. Pour ses identifiants de transaction, ZODB choisit la valeur la plus élevée entre l'horodatage actuel ou le dernier identifiant de transaction + 1.

Cependant, vous devriez peut-être envisager de ne pas utiliser d'horodatage comme identificateur, car cela entraînerait des conflits. sous forte charge, car toutes les demandes voudront créer des entrées dans le même seau BTree. La sélection aléatoire des ID éliminera presque tous les conflits, mais conduira à des BTrees inefficaces. L'approche recommandée est pour chaque thread qui crée des objets à partir d'un point aléatoire dans l'espace numérique et créer des identifiants de manière séquentielle. S'il trouve qu'un identifiant a déjà été utilisé, il doit choisir un autre point dans l'espace numérique et recommencer à partir de là. Je crois que zope.intid contient une implémentation de cette stratégie.

+0

Je pensais exactement à l'erreur de conflit: si elle est augmentée, comment se fait-il qu'elle répète la requête? La demande n'est-elle pas perdue? –

+0

Non, Plone (Zope en fait) réessaye car il y avait une erreur de conflit donc la requête n'est pas perdue puisque Zope est celui qui gère la requête. – vangheem

+1

Je doute que vous rencontrerez une situation d'erreur de conflit. Au lieu de cela, une demande recevra une exception concernant l'ID déjà utilisé. –

Questions connexes