2015-07-13 17 views
5

Hier ist meine CQL Tabelle:Woher weiß ich, dass der Datensatz dupliziert oder erfolgreich eingefügt wurde?

CREATE TABLE user_login (
    userName varchar PRIMARY KEY, 
    userId uuid, 
    fullName varchar, 
    password text, 
    blocked boolean 
); 

ich diesen DataStax java Treibercode

PreparedStatement prepareStmt= instances.getCqlSession().prepare("INSERT INTO "+ AppConstants.KEYSPACE+".user_info(userId, userName, fullName, bizzCateg, userType, blocked) VALUES(?, ?, ?, ?, ?, ?);"); 

batch.add(prepareStmt.bind(userId, userData.getEmail(), userData.getName(), userData.getBizzCategory(), userData.getUserType(), false)); 


PreparedStatement pstmtUserLogin = instances.getCqlSession().prepare("INSERT INTO "+ AppConstants.KEYSPACE+".user_login(userName, userId, fullName, password, blocked) VALUES(?, ?, ?, ?, ?) IF NOT EXIST"); 

batch.add(pstmtUserLogin.bind(userData.getEmail(), userId, userData.getName(), passwordEncoder.encode(userData.getPwd()), false)); 
      instances.getCqlSession().executeAsync(batch); 

Hier ist das Problem ist, dass, wenn ich IF NOT EXIST alle entfernen funktionieren gut, aber wenn es es einfach auszudrücken wieder nicht Fügen Sie Datensätze in die Tabelle ein, und werfen Sie keinen Fehler auf.

Woher weiß ich, dass ich das Duplikat userName einfüge?

Ich bin mit cassandra 2.0.1

Antwort

10

Verwenden INSERT... IF NOT EXISTS, dann können Sie ResultSet#wasApplied() verwenden, um die Ergebnisse zu überprüfen:

ResultSet rs = session.execute("insert into user (name) values ('foo') if not exists"); 
System.out.println(rs.wasApplied()); 

Hinweise:

  • diese CQL Abfrage ist eine leichte Transaktion , die Auswirkungen auf die Leistung haben. Weitere Informationen finden Sie unter this article.
  • Ihr Beispiel nur eine Anweisung hat, brauchen Sie nicht eine Batch-
+0

ich habe mehrere Aussage das ist, warum ich Batch verwende. Hier für die Einfachheit zeige ich nur eine Aussage – manish

+0

In meiner ursprünglichen Frage machte ich diese Änderungen 'instances.getCqlSession(). Execute (Batch) .wasApplied()' und ich bekomme 'com.datastax.driver.core.exceptions.UnavailableException : Nicht genug Replik für die Abfrage bei Konsistenz Quorum verfügbar (2 erforderlich, aber nur 1 am Leben) 'Ich bin diese App auf meinem lokalen System ausgeführt – manish

+0

Ich habe meine Frage für mehr Klarstellung aktualisiert – manish

-4

Sieht aus wie Sie eine ACID-Transaktion und Cassandra benötigen, einfach ausgedrückt, ist nicht ACID. Sie haben absolut keine Garantie, dass Sie in dem Intervall prüfen, ob der Benutzername existiert, er wird nicht von jemand anderem erstellt. Außerdem, im CQL-Standard tun INSERT und UPDATE das gleiche. Beide schreiben einen "neuen" Datensatz, der die alten löscht. Wenn es alte Aufzeichnungen gibt oder nicht, ist das nicht wichtig. Wenn Sie einen neuen Benutzer im laufenden Betrieb authentifizieren oder erstellen möchten, können Sie einen zusammengesetzten Schlüssel username + password und Ihre Abfrage als update verwenden, wobei username = datum UND password = datum. Auf diese Weise schlägt die Abfrage fehl, wenn der Benutzer Ihnen ein falsches Passwort gibt. Wenn der Benutzer neu ist, kann er kein "falsches" Passwort angeben und so wird sein Konto erstellt. Sie können jetzt für ein Feld wie "alreadysubscribed" testen, das Sie nur nach dem ersten Login setzen, so dass im Falle eines "soeben erstellten" Benutzers