К сожалению, вы не можете выполнить запрос SELECT
внутри пакетного оператора.Если вы прочитаете документы здесь , можно использовать только операторы вставки, обновления и удаления.
Требуется атомарность выполнения, но пакетные операторы не собираютсябудьте вперед.Если данные были изменены, ваша наихудшая ситуация - это зомби или данные, которые могут появиться снова.
Кассандра использует механизм периода оценки, чтобы справиться с этим, подробности здесь .Если по какой-либо причине это имеет решающее значение для вашей бизнес-логики, «лучшее», что вы можете сделать в этой ситуации, это повысить уровень согласованности или реструктурировать шаблон чтения на уровне приложения, чтобы не полагаться на идеальную атомарность, в зависимости от того, какая сделка правильная.выкл. для вас.Так что либо вы отказываетесь от части исполнения, либо снижаете требования.
На практике QUORUM
должно быть более чем достаточно для удовлетворения большинства ситуаций большую часть времени.В качестве альтернативы вы можете выполнить ALL
и заплатить штраф за производительность, но это означает, что все реплики для данного ключа раздела foo
должны будут подтвердить запись как в commitlog
, так и в memtable
.Обратите внимание, это по-прежнему означает, что flush
из commitlog должно произойти до того, как удаление будет complete
, но вы можете настроить согласованность на требуемый уровень.
У вас нет атомарности вСмысл SQL, но в зависимости от пропускной способности маловероятно, что он вам понадобится (коснитесь дерева).
TLDR:
USE CONSISTENCY ALL;
DELETE FROM data_by_user WHERE user = 'foo';
Это должно сработать.Ошибка, которую вы видите сейчас, это в основном анализатор грамматики ANTLR3 для CQL 3, который не предназначен для приема запросов SELECT внутри пакетов просто потому, что они не поддерживаются, вы можете видеть, что здесь .