nel mio server/server.jsMeteor: potrebbe accadere una condizione di gara con Meteor.collections sul lato server?
Meteor.methods({
saveOnServer: function() {
var totalCount = Collections.find({
"some": "condition"
}).count();
if (totalCount) {
var customerId = Collections.update('someId', {
"$addToSet": {
objects: object
}
}, function(err) {
if (err) {
throw err;
} else {
return true;
}
});
} else {}
}
});
Ho paura che quando saveOnServer() viene chiamato da 2 clienti, allo stesso tempo, verrà restituito lo stesso totalCount per ogni cliente e fondamentalmente finire l'inserimento stesso numero intero nell'id oggetto. L'obiettivo finale è inserire la riga sul lato server con un'operazione atomica che viene completata solo quando viene restituito correttamente totalCount
e il documento viene inserito assicurando che non esiste alcun ID duplicato? Sto provando a non usare il _id di mongodb ma ho il mio intero che incrementa la colonna id.
Mi chiedo come posso garantire che un campo venga incrementato automaticamente per ogni operazione di inserimento? Attualmente sto facendo affidamento sul numero totale di documenti. È possibile una condizione di gara qui? In tal caso, qual è il modo migliore per affrontare questo problema?
in linea di principio, il codice della meteora è troppo lontano dai dati per garantire questo. è un'idea migliore usare gli strumenti dbms per una tale convalida. – dandavis
sul lato server tutto è sincrono giusto per evitare l'inferno di callback utilizzando node-fiber? Ma meteor.collection gestisce mongodb, c'è un modo per garantire un oggetto meteor.collection sarà atomico o race condition free? – KJW
La stessa domanda è qui e ha risposto http://stackoverflow.com/questions/15886833/how-can-i-create-an-auto-increment-field-on-meteor. Il tuo codice non è un problema a meno che tu non stia girando su più di un server. – user728291