0

私は一緒に(同じまたは異なるテーブルの)複数のパーティションを更新する必要があるシナリオがあります。ここでの注文の例を考えてみましょう:カサンドラ軽量トランザクション

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)); 

挿入 したがって、上記の場合には、私はそのようバッチを使用するための新たな秩序が必要になる追加すると、* orders_とwork_ *テーブルに影響を与えると起こるはず一緒に。それはバッチでできないものです。

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; 

条件付きの更新問題: しかし、我々は*テーブルなどwork_ *テーブルをorders_変更する必要があることを比較し、設定に基づいてすることが必要である場合を取ることができます。例えば、フローに基づいて、注文は保留状態にあるときのみ取り消すことができます。ここで、更新ステートメントは完全にシリアル化され、競合状態を回避するためにLWTが必要です。しかし私たちはパクシの実装は、したがって、それは困難で、すべての文を入れて作る条件志向のバッチを、作る、パーティションの粒度で動作するようにのみ1 paritionに関連付けられている必要があり、バッチでそれを更新するかのことを理解して同じバッチ:

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; 

の一部が、私は信じているビューがorder_ *バッチでの問題の世話をすることができマテリアライズドが、どのように私はバッチに反映しなければならないwork_ *文の世話をしないその適切ことを保証するために、送信時にログに記録され、実行されます。私は私が達成しようとしているものを考える

は、ここでは可能ではない可能性がある、ここでは、部分的に直列化されたアイソレーションと不可分です。

答えて

0

LWTは、複数のパーティション(したがって、複数のテーブル)をまたがることはできませんので、あなたは運外です。

これは、このSO質問の同様のケース私には思える:Cassandra - Batch too largethis answer of mineを見ていると、それはあなたのユースケースに合うかどうかを確認します。

+0

私は、1つのテーブルを使用することは、それが分離し、同時にアトミック操作を行うので、間違いなく役立つと思います。私はこれに簡単な答えがあるかどうか、mysqlと同様に疑問に思っていた:( – Piyush