Пакетная мутация в Кассандре?
Я хочу обновить несколько строк в 2 CF. Меня не волнует порядок их обновления? Но гарантируется ли, что, если кто-то добьется успеха, то в конце концов другие тоже получат, если какой-то узел C* потерпит неудачу между ними?
Класс Hector BatchMutation использует пакетное обновление или атомарное пакетное обновление, поскольку это две разные вещи.
1 ответ
Вы должны использовать атомарный пакет в CQL3. Это гарантирует, что либо вся партия будет успешной, либо вся партия окажется неудачной. Пример из документации по CQL3:
BEGIN BATCH
INSERT INTO users (userid, password, name) VALUES ('user2', 'ch@ngem3b', 'second user');
UPDATE users SET password = 'ps22dhds' WHERE userid = 'user3';
INSERT INTO users (userid, password) VALUES ('user4', 'ch@ngem3c');
DELETE name FROM users WHERE userid = 'user1';
APPLY BATCH;
Класс Hector BatchMutation использует операцию Thrift batch_mutate. Это слабее, чем atomic_batch_mutate, который является Thrift-эквивалентом вышеупомянутого. batch_mutate является атомарным только для обновлений с одним и тем же ключом (хотя могут быть разные CF), тогда как atomic_batch_mutate является атомарным для всех обновлений. Я не думаю, что Гектор реализовал atomic_batch_mutate, поэтому вам нужно будет перейти на CQL3 и драйвер с поддержкой CQL3, например, драйвер Java DataStax.