Приведено ли обновление к ОБНОВЛЕНИЮ ИЛИ ВСТАВКЕ

Cassandra поддерживает upsert для UPDATE. То есть, если ключ, указанный в операторе обновления, не существует в таблице; подразумевается как вставка. Есть ли способ узнать из кода возврата запроса на обновление, привело ли обновление к обновлению или вставке. Мы бы предпочли обнаружить это без дополнительного чтения от Кассандры.

У нас есть сценарий, в котором у нас есть приложение с очень высокой пропускной способностью, где 99% событий приводят к вставке, но очень небольшой фрагмент приводит к обновлению. После обновления мы хотели бы выполнить некоторые дополнительные проверки и запустить некоторые из них.


person Sunil    schedule 02.03.2017    source источник


Ответы (2)


Вы можете добавить IF EXITS в конце оператора обновления.

Таким образом, оператор обновления будет:

UPDATE person SET name = 'xxxxx' WHERE id = '16843158' IF exists;

для таблицы человека и имя, id – это имена столбцов.

Это вернет True, если строка выйдет, и False, если нет. Используя это, вы можете создать проверку, а затем «выполнить некоторые дополнительные проверки и запустить некоторые». Также это ничего не вставит, если строка не выйдет.

Пожалуйста, проверьте, возвращается ли true/false как столбец Row или как логическое значение, потому что я проверял это только в cqlsh.

Разговор за Яву. В cqlsh он отображается как вывод столбца.

person r005t3r    schedule 02.03.2017
comment
Думаю, если бы у Кассандры была немного противоположность, это помогло бы нам. Как я уже сказал, в нашем случае 99% входящих записей приводят к вставке. И 1% обновление. Мы хотим, чтобы оба делали то, что он делает; обновить или вставить. Но я просто хочу знать после выполнения upsert, что на самом деле произошло; обновить или вставить. - person Sunil; 06.03.2017
comment
В порядке! Я понимаю, что именно вы хотите. Я сомневаюсь, что то, что вы хотите, существует на уровне самой Кассандры. Вы, вероятно, должны иметь эту функциональность на уровне вашего приложения. Используя приведенный выше запрос, вы можете узнать, удалось ли выполнить обновление или его необходимо вставить (см. Сквозь слова). Кажется, что после нормального выполнения upsert нет никакого способа решить, что на самом деле произошло; обновить или вставить. - person r005t3r; 06.03.2017

Краткий ответ: все записи Cassandra являются upserts, они не проверяют и не могут проверять состояние базы данных перед записью.

Более длинный ответ: знание того, установлено ли значение, требует чтения из Cassandra, а это означает, что если вы хотите знать, существует ли что-то, когда вы вставляете upsert, это означает, что вам в конечном итоге придется выполнять антишаблон чтения перед записью.

В основном все модели данных, которые требуют такого рода информации о состоянии, должны будут нести потери производительности. Лучше всего найти другой способ структурировать код. Если вам действительно нужно знать разницу, вы можете попробовать поддержку Paxos, если не существует запросов стиля, но знайте, что они также имеют свою цену.

person RussS    schedule 02.03.2017
comment
Мы хотим обновить или вставить независимо. Я просто пытаюсь выяснить, как после выполнения оператора обновления узнать, привело ли оно к обновлению или вставке. - person Sunil; 06.03.2017
comment
Вы не можете знать - person RussS; 06.03.2017