2016-04-13 6 views
0

Ich bin ein mehrere thread zu tun, um Änderungen und Updates auf dem gleichen Objekt zu tun!Wie zu vermeiden Daten überschreiben (verloren) schreiben - Update auf das gleiche Objekt von mehreren Thread in Cassandra

wir halten es einfach:

Ich habe ein obj1: | ID | Zähler | Zeitstempel | :)

run() 3 Thema T1, T2 T3 Zähler zu tun ++

Ich bin neu in Cassandra so aus Ihrer Erfahrung, wie kann ich sperren das Objekt meiner aktualisieren oder Hexe-Lösung zu tun, du für mich vorschlagen zu verwenden, um das Überschreiben der Daten in einer solchen Situation zu vermeiden!

suchen, von Ihnen zu hören und danken Ihnen

+0

Können Sie das Skript ** CREATE TABLE ** Ihrer Tabelle posten? – doanduyhai

+0

es ist eine Beispieltabelle mit einem einfachen Replikations-Strategie-Faktor 1 – Housekl

Antwort

0

Es gibt keine Schlösser. Anstatt dasselbe Objekt zu mutieren, schreiben Sie ein Protokoll der Mutationen, die Sie abstimmen sollten. Suchen Sie nach CRDT oder Event Sourcing und je nach Szenario können Dinge ein wenig anders umgesetzt werden.

Alternativ können Sie Transaktionen mit geringem Gewicht verwenden und so lange versuchen, bis Ihre Mutation funktioniert, aber Ihr Durchsatz wird im Vergleich sehr gering sein. Je nach Ihren Gleichzeitigkeit/Durchsatzanforderungen kann es ausreichen, wenn

UPDATE purchases SET balance=-200 WHERE user='user1' IF balance=-208; 

Wenn es mit neuen Wiederholung schlägt fehl, wenn/Balance-Klausel.

Erwähnenswert gibt es einen Zählertyp: https://docs.datastax.com/en/cql/3.1/cql/cql_using/use_counter_t.html , wenn Ihr gerade oder Dekrementieren Inkrementieren, die Ihren speziellen Fall tun würde.

+0

Danke Chris, aber ich habe nicht Ihren ersten Teil in Bezug auf ein Protokoll der Mutationen zu versöhnen. Ich habe auch die leichten Transaktionen versucht, aber funktioniert nicht für mich, der Zähler ist nur ein Anwendungsfall, es ist nicht vom Typ Zähler, Wenn es eine Lösung gibt, wenn ich das Objekt Formular DB bekomme, mache meine Operation und während des Updates werde ich überprüfe den Zeitstempel in Echtzeit, wenn er sich ändert oder nicht und basierend auf dem, was ich begehe? – Housekl

+0

"funktioniert nicht für mich"? aber yeah, ein timestamp ** uuid ** würde funktionieren, um zu überprüfen, ob es von deinem letzten Lesevorgang geändert wurde (es können Kollisionen auf derselben ms sein, wenn du nur den Zeitstempel verwendest). Es wäre jedoch sehr langsam. [CRDT] (https://hal.inria.fr/file/index/docid/445975/filename/icdcs09-treedoc.pdf) und [Ereignisbeschaffung] (http://martinfowler.com/eaaDev/EventSourcing.html) ist, wie Sie immer noch sehr schnelle Schreibvorgänge haben und Parallelkonflikte vermeiden. Auch Dinge wie OT, CQRS, irgendwie ein Kaninchenloch genannt, aber sie haben ein ähnliches Ziel - Konflikte vermeiden. Ich empfehle, etwas Zeit zu verbringen googeln/youtube –

+0

danke für die Links, ich werde sie überprüfen und komme zurück, wenn ich eine Lösung für diesen Aufsatz finden! Jeder Kommentarvorschlag von Ihrer Seite ist willkommen – Housekl