2016-12-06 3 views
0

Je suis en train d'exécuter 3 inserts conditionnels à différentes tables à l'intérieur d'un lot à l'aide du cpp-pilote Cassandra:Cassandra: Lot avec des conditions ne peut pas couvrir plusieurs tables

BEGIN BATCH 
insert into table1 values (...) IF NOT EXISTS 
insert into table2 values (...) IF NOT EXISTS 
insert into table3 values (...) IF NOT EXISTS 
APPLY BATCH 

Mais je reçois l'erreur suivante:

Si ce qui précède n'est pas possible dans Cassandra, quelle est l'alternative pour effectuer plusieurs insertions conditionnelles en tant que transaction et s'assurer que tout réussisse ou échoue?

Répondre

1

Je crains qu'il n'y ait pas d'alternatives. Les instructions conditionnelles dans un environnement BATCH sont limitées à une seule table et je ne pense pas que des modifications soient possibles dans le futur.

Cela est dû à la façon dont Cassandra fonctionne en interne: un lot contenant une mise à jour conditionnelle (il est appelé transaction légère) ne peut être utilisé dans une partition, car ils sont basés sur la mise en œuvre Paxos, parce que le Paxos se travaille à niveau de partition seulement. De plus, dans un lot avec plusieurs instructions conditionnelles dans le même BATCH, toutes les conditions doivent être vérifiées pour que le lot réussisse. Même si une (et seulement) mise à jour conditionnelle échoue, le lot entier échouera.

Vous pouvez en savoir plus sur les instructions BATCH dans le.

Vous obtiendrez essentiellement un succès de performance pour la mise à jour conditionnelle, et un coup de performance pour une opération par lots, et C * vous empêche d'aller si loin.

Il me semble que vous l'avez conçu comme un SGBDR. Une solution alternative sans SQL, je ne sais pas si elle peut être appliquée à votre cas d'utilisation, vous pourriez dénormaliser vos données dans une 4ème table qui combine les 3 autres tables, puis fournir une seule mise à jour à cette 4ème table .