Apache Cassandra удалить из счета
Я разрабатываю небольшое веб-приложение для изучения Apache Cassandra и Java EE 6.
Версия Cassandra - 1.1.6.
У меня проблема, которая сводит меня с ума...
Я создал таблицу со счетчиком (используя cqlsh v. 3.0.0)
CREATE TABLE test (
author varchar PRIMARY KEY,
tot counter
)
и поместите некоторые значения таким образом:
update test set tot = tot +1 where author = 'myAuthor';
семейство столбцов отлично обновлено
author | tot
----------+-----
myAuthor | 1
НО, если вы попытаетесь удалить эту строку, а затем снова обновить (с тем же ключом), тогда ничего не произойдет! Таблица больше не обновляется, и я не могу понять, почему: мне кажется, что, как только вы использовали ключ, вы больше не сможете его использовать.
Я искал подсказки в документации по документам (http://www.datastax.com/docs/1.1/references/cql/cql_lexicon), но не смог найти решение.
Может кто-нибудь мне помочь?
Спасибо заранее
Ответы
Ответ 1
Кассандра имеет некоторые строгие ограничения на удаление счетчиков. Вы не можете удалить счетчик, а затем использовать его за любой короткий промежуток времени. Из Cassandra wiki:
Удаление счетчика по существу ограничено. Например, если вы очень быстро выполняете последовательность "increment, remove, increment", возможно, что удаление будет потеряно (если по какой-то причине удаление является последним принятым сообщением). Следовательно, удаление счетчиков предоставляется только для окончательного удаления, то есть когда удаленный счетчик не увеличивается после этого. Это также относится к удалению строк: если вы удаляете строку счетчиков, приращение любого счетчика в этой строке (существовавшей до удаления) приведет к неопределенному поведению. Обратите внимание, что если вам нужно reset счетчик, один из вариантов (к сожалению, не одновременно безопасный) может состоять в том, чтобы прочитать его значение и добавить -value.
Ответ 2
Решение по повторному добавлению удаленного счетчика - очистить всю запись из таблицы:
nodetool repair $table
cqlsh -c "ALTER TABLE $table WITH gc_grace_seconds=1;"
sleep 1
nodetool compact $table
Как вы можете себе представить, это не практично в реальной системе и, вероятно, должно быть зарезервировано для чрезвычайных ситуаций, если важный счетчик каким-то образом случайно удален.
Лучше убедиться, что этого никогда не произойдет.