Кассандра: Обеспечение атомарности и предотвращение "грязного чтения" одновременно

Мне нужно атомарно вставить несколько строк в таблицу 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, но я не могу найти ответ на вопрос, почему это ограничение для пакетных операторов классифицируется как ошибка, а не предупреждение? Что может помочь обойти эту проблему?

Будем благодарны за любые идеи и помощь в понимании философии Кассандры.

0 ответов

Другие вопросы по тегам