批量更新中的Cassandra轻量级事务影响多个分区/表

时间:2017-01-05 07:10:35

标签: cassandra datastax-enterprise cassandra-2.1 acid datastax-startup

有一种情况我需要一起更新多个分区(相同或不同的表)。考虑一下这里的订单示例:

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 ('me@me.com',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 ('me@me.com','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;

条件更新问题: 但是,让我们来看一个需要比较和设置的情况,并根据我们需要更改orders_ * table以及work_ *表。例如,基于流程,订单只能在处于“待处理状态”时才被取消。这里的更新语句需要LWT才能使其完全序列化并避免任何竞争条件。但据我所知,如果我们在批处理中更新那个只应该与一个分区相关联,因为Paxos实现在分区的粒度下工作,因此使批处理面向条件,这使得很难将所有语句放入同一批次:

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_ *和batch的问题,但是我如何处理必须批量反映的work_ *语句,以确保在提交时正确记录和执行。

我认为我想要实现的是Atomicity,这里有部分序列化隔离,这可能是不可能的。

1 个答案:

答案 0 :(得分:0)

LWT不能跨越多个分区(因此多个表),所以你运气不好。

在我看来,这个问题类似于Cassandra - Batch too large。查看this answer of mine并查看它是否适合您的使用案例。