0

Существует сценарий, в котором мне нужно обновить несколько разделов (одной и той же таблицы). Рассмотрим пример заказов здесь: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 с частично сериализованной изоляцией здесь, что может быть невозможно здесь.

ответ

0

LWT не может охватывать несколько разделов (следовательно, несколько таблиц), поэтому вам не повезло.

Это похоже на аналогичный случай этого вопроса: Cassandra - Batch too large. Посмотрите на this answer of mine и проверьте, подходит ли он вашему прецеденту.

+0

Я считаю, что использование одной таблицы определенно помогает, поскольку она изолирует и выполняет атомарную работу одновременно. Мне было интересно, был ли легкий ответ на этот вопрос, похожий на mysql :( – Piyush

Смежные вопросы