Существует сценарий, в котором мне нужно обновить несколько разделов (одной и той же таблицы). Рассмотрим пример заказов здесь:Cassandra Light Weight Transaction в пакетном обновлении, влияющем на несколько разделов/таблиц
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;
Условный Update Issue: Однако, давайте случай, когда нужно сравнить, а также и на основании, что нам нужно изменить orders_ * таблицы, а также 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_ * и партии, но как я могу заботиться о work_ * заявления, которые должны отражать в пакетном режиме, чтобы убедиться, что его правильно регистрируются и выполняются при их представлении.
Я думаю, что я пытаюсь достичь, это Atomicity с частично сериализованной изоляцией здесь, что может быть невозможно здесь.
Я считаю, что использование одной таблицы определенно помогает, поскольку она изолирует и выполняет атомарную работу одновременно. Мне было интересно, был ли легкий ответ на этот вопрос, похожий на mysql :( – Piyush