有一种情况我需要一起更新多个分区(相同或不同的表)。考虑一下这里的订单示例:
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,这里有部分序列化隔离,这可能是不可能的。
答案 0 :(得分:0)
LWT不能跨越多个分区(因此多个表),所以你运气不好。
在我看来,这个问题类似于Cassandra - Batch too large。查看this answer of mine并查看它是否适合您的使用案例。