0

Il existe un scénario dans lequel j'ai besoin de mettre à jour plusieurs partitions (de la même table ou d'une table différente) ensemble. Prenons un exemple des commandes ici:Cassandra Lightweight Transaction dans la mise à jour par lots affectant plusieurs partitions/tables

create table test.orders_by_id(
    order_email text, 
    order_id  timeuuid, 
    order_name text, 
    order_status int,     
    order_note text,   //1 - Pending, 2 - In Progress, 3 - On Hold, 4 - Confirmed, 5 - Cancelled 
    order_number text, 
    PRIMARY KEY (order_id) 
); 

create table test.orders_by_number(
    order_email text, 
    order_id text, 
    order_name text, 
    order_status int,     
    order_note text, 
    order_number text, 
    PRIMARY KEY (order_number) 
); 

create table test.work_audit_orders (
    order_id text, 
    log_id timeuuid, 
    log_audit text, 
    PRIMARY KEY(order_id,work_log_id)); 

Insertion Ainsi, dans le cas ci-dessus, l'ajout d'un nouvel ordre, il faudrait pour moi d'utiliser le lot comme qui affecteraient orders_ * et marche pas_ * tables et devrait se produire ensemble. C'est quelque chose qui est faisable dans un lot.

begin batch 
     insert into test.orders_by_id(order_email,order_id,order_name,order_status,order_number) values ('[email protected]',d1918050-d310-11e6-946e-d368aab1da02,'ORDER_1023',1,'1235'); 
     insert into test.orders_by_number(order_email,order_id,order_name,order_status,order_number) values ('[email protected]','d1918050-d310-11e6-946e-d368aab1da02','ORDER_1023',1,'1235'); 
     insert into test.work_audit_orders(order_id,log_id,log_audit) values ('d1918050-d310-11e6-946e-d368aab1da02',now(),'New Order Created: order 1235'); 
apply batch; 

Mise à jour conditionnelle Problème: Cependant, permet de prendre un cas où il faut comparer et fixer et sur la base que nous devons changer orders_ * table ainsi que des tables * marche pas_. Par exemple, en fonction d'un flux, l'ordre ne peut être annulé que dans l'état En attente. Ici, les instructions de mise à jour nécessiteront LWT pour le rendre complètement sérialisé et éviter toute condition de concurrence. cependant si je comprends bien que si nous mettons à jour cela dans le lot qui devrait seulement être associé à une parition car l'implémentation de Paxos travaille à la granularité de la partition, rendant ainsi le lot orienté vers la condition, ce qui rend difficile de mettre toutes les déclarations dedans le même lot:

begin batch 
     update orders_by_id set order_status = 5 where order_id = d1918050-d310-11e6-946e-d368aab1da02 if order_status = 1; 
     update orders_by_number set order_status = 5 where order_number='1235' if order_status = 1; 
     insert into work_audit_orders (order_id, log_id, log_audit) values ('d1918050-d310-11e6-946e-d368aab1da02', now(),'Order 1235 Cancelled'); 
     apply batch; 

en partie je crois que les vues matérialisées peuvent prendre soin du problème avec Order_ * et le lot, mais comment puis-je prendre soin de la marche pas_ * déclarations qui doivent refléter dans le lot pour assurer que son bien enregistré et exécuté lorsqu'il est soumis.

Je pense que ce que j'essaye de réaliser est Atomicity avec l'isolation partiellement sérialisée ici, qui peut ne pas être possible ici.

Répondre

0

Le LWT ne peut pas couvrir plusieurs partitions (donc plusieurs tables), donc vous n'avez pas de chance.

Cela me semble un cas similaire de cette question SO: Cassandra - Batch too large. Jetez un oeil à this answer of mine et vérifiez si cela correspond à votre cas d'utilisation.

+0

Je crois que l'utilisation d'une table aide certainement car elle isole et fait l'opération atomique en même temps. Je me demandais s'il y avait une réponse facile à ceci, semblable à mysql :( – Piyush