2014-01-15 8 views
9

Ich schreibe eine Anwendung und ich muss in der Lage sein zu sagen, ob ein Einfügungen und Updates erfolgreich sind. Ich benutze "INSERT ... IF NOT EXISTS", um das leichtgewichtige Transaktionsverhalten zu erhalten, und bemerkte, dass die von execute zurückgegebene Ergebnismenge eine Zeile mit aktualisierten Daten und eine Spalte "[applied]" enthält, die abgefragt werden kann. Das ist großartig. Aber ich habe eine Update-Anweisung, die ein leeres ResultSet zurückgibt. Es scheint, als ob das Update erfolgreich ist, aber ich möchte einen programmatischen Weg, dies zu überprüfen.Cassandra Java-Treiber: Wie werden Ergebnisse zum Einfügen, Aktualisieren und Löschen gemeldet?

zu klären:

ich auf einige Protokollierung der Ergebnismengen durch meine Mutationen zurück gemacht haben. Ich habe festgestellt, dass "INSERT ... IF NOT EXIST" ein ResultSet mit einer booleschen Spalte namens "[applied]" zurückgibt. Wenn "[applied]" den Wert "false" hat, wird auch die Zeile zurückgegeben, die bereits existiert.

Mit UPDATE sehe ich immer ein leeres ResultSet.

So habe ich zwei Fragen:

  1. Wo ist die Dokumentation auf, was die ResultSet für jede Art von Mutation enthalten sollte? Ich habe es nicht in den CQL-Dokumenten oder in den Java-Treiber-Dokumenten gesehen. Ich habe sogar versucht, die Dokumente anderer Sprachintegrationen zu betrachten und fand keine Beschreibung des ResultSet-Inhalts für Mutationen.
  2. Gibt es eine Möglichkeit herauszufinden, wie viele Zeilen durch ein UPDATE geändert oder durch ein DELETE gelöscht wurden?

Antwort

3

Auch ich bin mit dem gleichen Problem fest. Eine Sache (ein schlechter Hack), die ich entdeckte, ist, wenn das Update oder Einfügen fehlschlägt, sind die Spaltendefinitionen in der Ergebnismenge mehr als eins und wenn Mutationen erfolgreich sind, enthält die Spaltendefinition nur eine Spalte, d. H. "Angewandt". Das Problem ist, dass ResultSet den Wert der Spalte "applied" nicht enthält. Dies ist "true", wenn die Mutation erfolgreich ist, und "false", wenn die Transaktionen das Ändern der Daten verhindern. Ich benutze diesen Hack ab sofort in meiner Anwendung, aber ich denke nicht, dass es eine gute Lösung ist, so dass ich sogar nach einer besseren Lösung suche.

+0

Ja, das ist nicht wirklich ein Hack, denn nur so scheint Cassandra das Ergebnis der Mutation mitzuteilen. Ich mache das Gleiche. Ich entdeckte dies, indem ich den Inhalt der Ergebnismengen protokollierte, von denen ich erwartete, dass sie leer waren. Ich wünschte, die Dokumentation wäre klarer zu diesem Verhalten. – AlphaGeek

+1

Sogar du !? Wow, das ist ein ernstes Problem! – Maxim

+0

Cassandra doc .: Ein INSERT schreibt eine oder mehrere Spalten atomar und isoliert in eine Cassandra-Tabelle. Keine Ergebnisse werden zurückgegeben. – Maxim

3

In Cassandra insert/update/delete gleich verhalten, und sie sind genannt Mutationen. Wenn Ihr Client keine Ausnahmen zurückgibt, ist die Mutation abgeschlossen.

Wenn Sie Bedenken bezüglich der Konsistenz Ihrer Mutationsaufrufe haben, fügen Sie CONSISTENCY mit höheren Ebenen hinzu.

http://www.datastax.com/docs/1.0/references/cql/index http://www.datastax.com/docs/1.1/dml/data_consistency

Wenn Sie nach guter Konsistenz sind, empfehle ich LOCAL_QUORUM für beide und Mutationen lesen. Auf diese Weise müssen Sie sich keine Gedanken über eine programmatische Überprüfung einer Mutation machen, da dies ein konsequentes Lesen erfordert.

+0

Danke, das ist hilfreich, aber es geht nicht um das eigentliche Problem. Ich habe der Frage einige Informationen hinzugefügt, um mein Problem zu klären. – AlphaGeek

+0

Was gibt Cassandra zurück, wenn die Mutation fehlschlägt? – Cody

1

Gibt es eine Möglichkeit, um herauszufinden, wie viele Zeilen von einem DELETE durch einen UPDATE oder gelöscht geändert wurden?

Soweit ich sagen kann, nein, weil die DELETE oder UPDATE ist schließlich konsistent. Es ist möglich, dass ein INSERT mit der Konsistenzstufe ONE oder LOCAL_ONE nicht vollständig repliziert wurde und die Mutation auf einem anderen Host vor INSERT vollständig repliziert ausgeführt wurde. Die Mutation wird weiterhin angewendet, aber Sie können nicht wissen, wie viele Zeilen tatsächlich betroffen waren.

+1

ja im letzten Jahr habe ich viel mehr über die Implikationen einer möglichen Konsistenz gelernt. Trotzdem danke – AlphaGeek

2

Eine Abhilfe ich verwende, um zu bestimmen, ob INSERT gearbeitet oder nicht, ist die Zeilendaten aus ResultSet zurückgegeben zu überprüfen:

ResultSet rs = session.execute(bs); 
Row row = rs.one(); 
boolean insertFailed = row.getColumnDefinitions().contains("ownerid"); 

Hier ownerid ist der primäre Zeilenschlüssel. Sie können Ihren jeweiligen Spaltennamen verwenden.