2011-10-14 6 views
3

Est-il possible d'atteindre des blocages sur les opérations upsoft de MongoDb? Je suis d'effectuer une charge test sur une opération de upsert qui ressemble à:MongoDb Upsert Deadlock

db.update(
    { foo: {a: 'xxx', b: 'yyy'}, $lt: {"order.date": someDate}}, 
    {order: order}, 
    true, false); 

Déployé sur la machine Azure avec le pilote officiel mongodb C#. Instance unique, pas de réplica-ensembles ou fragmentation pour le moment. Lorsque j'exécute 5000 de cette même commande de mise à jour, divisée en 200 threads simultanés (2 machines @ 100 threads chacune), la plupart du temps elle se terminera par des blocages. C'est à dire. la plupart des appels ne reviennent jamais. Je peux voir à partir de db.currentOp() via la console, la plupart des mises à jour sont toujours là, bloquées dans un verrouillé: true, avec lockType: 'write'.

Pourquoi cette impasse survient-elle? Comment est-ce possible? Et comment puis-je l'empêcher? Existe-t-il des directives spécifiques sur le type d'opérations à éviter pour éviter les blocages sur mongodb?

Est-ce que $ atomic est lié à la solution? Je ne sais même pas comment définir $ atomic: true sur C#, bien que cela ne soit probablement pas pertinent pour ce problème d'interblocage.

+0

Upsert est une opération de mise à jour? – sll

+0

c'est une mise à jour avec le drapeau upsert réglé sur true – Sheepy

Répondre

0

$atomic should help

db.update(
    { 
     $and: [ 
      { foo: { a: 'xxx', b: 'yyy' }, 
      { $lt: { 'order.date': someDate } } 
     ], 
     $atomic: true 
    }, 
    { order: order }, 
    true, 
    false 
); 

aussi, vous voudrez peut-être un $ et la clause. vérifiez votre explication pour votre appel pour voir quels index sont utilisés, etc ...