2016-04-12 4 views
0

Afin de minimiser nombre de requêtes que j'utilise seule méthode UPDATE dans mon application:Cassandra: Comment savoir si l'opération est insérer ou mettre à jour

UPDATE lp_registry.domain SET dr = ?, ud = dateOf(now()) WHERE d1 = ? AND d2 = ? AND d3 = ? 

Si une ligne avec d1 clé primaire correspondante, d2, d3 doesn n'existe pas, alors il est automatiquement créé et c'est ce que je veux.

Mais ce que je veux aussi, c'est savoir, si la ligne a été insérée ou mise à jour. J'ai lu dans cassandra documentation sur le résultat IF EXIST et 'appliqué'. Cependant ceci:

UPDATE lp_registry.domain SET dr = ?, ud = dateOf(now()) WHERE d1 = ? AND d2 = ? AND d3 = ? IF EXISTS 

ne fonctionnera pas si la ligne n'existe pas.

Est-il possible de faire UPSERT sans (SELECT et (INSERT ou UPDATE)) et garder une trace sur l'insertion ou la mise à jour de la ligne?

Répondre

1

La réponse à votre question est non, vous ne pouvez pas déterminer si une écriture a effectué une nouvelle insertion d'une ligne ou une mise à jour à une ligne existante. Comme vous le constatez, vous pouvez le faire vous-même en effectuant une lecture avant écriture, mais vous avez ensuite introduit un hit de performance sur chaque écriture.

De par sa conception, Cassandra exécute Upserts. Cette optimisation des performances permet au moteur DB de Cassandra d'écrire des données sans vérifier (lecture) s'il existe déjà.

If EXISTS est une forme de transactions légères LWT. Ils sont souvent utilisés pour le contrôle de concurrence optimiste et ont une latence accrue (jusqu'à quatre fois) en raison de la lecture-avant-écriture implicite.

2

Votre question est source de confusion, titre dit à connaître opération. En détail, vous dites, vous voulez une requête uniforme que vous pouvez utiliser pour insérer ou mettre à jour.

En cassandra mise à jour et l'insertion sont quelque chose. Insérez simplement une requête avec une ligne complète à chaque fois (toutes les colonnes), si elle existe, elle sera mise à jour en fonction de la clé primaire.

S'il n'existe pas, il sera inséré.