2017-01-25 5 views
1

Wie verhindert Meteor, wenn zwei Benutzer die gleiche Sammlung aktualisieren? Ich vermute, dass es etwas mit Fibers zu tun hat.Race condition in Meteor

Der folgende Code stammt aus der Tutorieliste. Was passiert, wenn zwei Benutzer gleichzeitig ein Kontrollkästchen aktivieren? Wie verhindert der Meteor den Wettlaufzustand? Kannst du mich auf den richtigen Punkt im Quellcode hinweisen?

Template.task.events({                        
    'click .toggle-checked'() { 
    // Set the checked property to the opposite of its current value 
    Tasks.update(this._id, { 
     $set: { checked: ! this.checked }, 
    }); 
    }, 
    'click .delete'() { 
    Tasks.remove(this._id); 
    }, 
}); 

Antwort

0

Ich denke, das ist ein Rand Fall. Meteor ist an Mongodb gebunden und Mongodb implementiert Sperren, wenn es aktualisiert wird. Jemand, der auch hier in SO ist, sollte dies bestätigen. Auch habe ich dieses Problem meiner Erfahrung nach nicht erlebt.

Wie auch immer, wenn Sie auch Anrufe auf eine bestimmte Methode (Begrenzung der Aufrufe einer Methode auf dem Server) Rate-Limit, können Sie ein https://atmospherejs.com/meteor/ddp-rate-limiter Paket von Atmosphäre verwenden! Wenn Sie dies verwenden, können Sie Anrufe auf eine Methode für den aktuellen Benutzer beschränken. Eine schöne Anleitung ist in Meteor Koch Blog zur Verfügung: https://themeteorchef.com/tutorials/rate-limiting-methods

me ..

1

Meteor tut nichts in Ihrem Szenario wissen lassen, es ist bis zu MongoDB es zu handhaben. und das hängt davon ab, welche Speicher-Engine Sie verwenden.

WiredTiger ermöglicht das Sperren auf Datensatzebene. hier überprüfen: https://docs.mongodb.com/manual/faq/concurrency/#how-granular-are-locks-in-mongodb

Für die meisten Lese- und Schreiboperationen, WiredTiger optimistisch Concurrency Control verwendet. WiredTiger verwendet nur Intent-Sperren auf der globalen Datenbank- und Collection-Ebene . Wenn die Speicher-Engine Konflikte zwischen zwei Operationen feststellt, wird ein Schreibkonflikt verursacht MongoDB, diese Operation transparent erneut zu versuchen.