2015-03-27 3 views
14

Mein Verständnis ist, dass Update mit upsert: True für ein einzelnes Dokument ist eine atomare Operation, so sollte dies nie zu einem doppelten Schlüsselfehler führen, vor allem nicht auf der primären _id Schlüssel, wenn die Sammlung keine eindeutigen-ly indizierten Felder hat:mongodb unmöglich (?) E11000 Duplikatschlüssel Fehler dup Schlüssel beim Upserting

Order.update({ _id: order._id }, query, { upsert: true }, cb) // with mongoose 

Aber dies erscheint im mongod.log:

2015-03-27T09:39:10.349-0400 I WRITE [conn258236] update xyz.orders 
query: { _id: "6353f880-c6a7-4260-809f-98e0af27b9a2" } update: { $set: { ... 
} keyUpdates:0 writeConflicts:0 **exception: E11000 duplicate key error dup 
key: { : "6353f880-c6a7-4260-809f-98e0af27b9a2" } code:11000** numYields:1 
locks:{} 138ms 


    2015-03-27T09:39:10.349-0400 I COMMAND [conn258236] command xyz.$cmd 
command: update { update: "orders", writeConcern: { w: 1 }, ordered: true, 
updates: [ { q: { _id: "6353f880-c6a7-4260-809f-98e0af27b9a2" }, u: { $set: { 
... } }, multi: false, upsert: true } ] } keyUpdates:0 writeConflicts:0 
numYields:0 reslen:235 locks:{} 139ms 

Hier ist die Ausgabe von db.orders.getIndexes():

{ 
    "v" : 1, 
    "key" : { 
     "_id" : 1 
    }, 
    "name" : "_id_", 
    "ns" : "xyz.orders" 
}, 

Wir verwenden MongoDB Version 3.0.0 mit WiredTiger.

+0

Was ist der Wert von 'order._id' und' query' - haben beide den gleichen '_id' Wert? – DaveCoast

+0

Ja. Die Zeilen im Protokoll sind für eine bestimmte Ausführung des Mungo-Anrufs mit order._id als "6353f880-c6a7-4260-809f-98e0af27b9a2" festgelegt. – Jason

+0

Die Anrufe kommen von der gleichen Verbindung mit '{w: 1}', also waren sie wahrscheinlich seriell und nicht gleichzeitig - wie generiert man den 'order._id' Wert? Sind Sie sicher, dass Sie das Update nicht zweimal mit derselben 'order._id' im selben Thread/Prozess aufgerufen haben? – wdberkeley

Antwort

11

Ich habe Angst, dass dies ein anhaltendes Problem ist. Ich hatte das gleiche Problem und ich fand ein jira Ticket dazu:

https://jira.mongodb.org/browse/SERVER-14322

Es ist möglich, dass zwei Updates kommen mit Upsert: true, was weder ein Dokument und beiden Einfügen neue Dokumente zu finden, die Konflikt bei eindeutigen Indexverletzungen des Abfrageprädikats.

Die "Lösung" hier ist, einen Wiederholungscode in den Client hinzuzufügen.

+6

Immer noch dieses Problem mit Mongo 3.4 ..... – db80

+2

Ja ist es super nerviger Bug, kann nicht glauben, dass es immer noch in 3.4 ist. Neuversuche auf der Clientseite ad infinitum sind eine hässliche Problemumgehung. – user2667976

+0

Sie müssen nur einmal höchstens einmal versuchen. Und wenn der Wiederholungsversuch überhaupt notwendig ist (aufgrund eines doppelten Konflikts), wird dies auf jeden Fall zu einem Update führen. – Shashank

Verwandte Themen