Кассандра: Обеспечение атомарности и предотвращение "грязного чтения" одновременно
Мне нужно атомарно вставить несколько строк в таблицу Cassandra, которые имеют разные ключи раздела. В то же время, мне нужно убедиться, что для каждого запроса состояние данных, которое пользователь обновляет / вставляет, корректно (чтобы в случае состояния гонки данные не испортились). Например, структура БД:
create table test(
id uuid,
userid uuid,
address text,
PRIMARY KEY ((id), userid)
);
При вставке строк мне нужно убедиться, что для каждого из них этого ПК нет в базе данных, я не хочу случайно перезаписывать данные (Кассандра просто сделает это). Для этого существуют легкие транзакции, поэтому я могу просто добавить IF NOT EXISTS
пункт, и это будет сделано. Но проблема в том, что у меня есть несколько таких вставок, которые должны либо все успешно, либо ни одна из них. Следующее решение не работает:
BEGIN BATCH
INSERT INTO test(id, userid, address) VALUES(50fcdfd9-7f61-11e5-9c9d-a0999b0af139, daf38231-eab1-4cd3-ae31-8d28d15c762b, 'addr1') IF NOT EXISTS;
INSERT INTO test(id, userid, address) VALUES(9c26fcc0-0f82-472c-8e83-01b90bed60cc, 0d1a91c4-780a-4bc6-9c12-f2976cb7b3ef, 'addr2') IF NOT EXISTS;
APPLY BATCH;
Выданная ошибка: Batch with conditions cannot span multiple partitions
, Документация говорит только об этом, не предлагая обходного пути. Есть ли способ обеспечить атомарность и согласованность такого рода на уровне базы данных? Я понимаю, что принцип ACID не может быть гарантирован для Cassandra, но я не могу найти ответ на вопрос, почему это ограничение для пакетных операторов классифицируется как ошибка, а не предупреждение? Что может помочь обойти эту проблему?
Будем благодарны за любые идеи и помощь в понимании философии Кассандры.