В Cassandra UPDATE
ведет себя очень похоже на оператор INSERT
, как объясняется в документации Apache CQL:
"Обратите внимание, что в отличие от SQL, UPDATE
не проверяетпредыдущее существование строки по умолчанию (кроме как через IF, см. ниже): строка создается, если ее раньше не было, и обновляется иначе. Кроме того, нет средств, чтобы узнать, произошло ли создание или обновление. "- CQL Documentation - Update
Я провел простой тест, и он сработал:
cqlsh:test_keyspace> select * from conditional_updating ;
id | firstname | lastname
----+-----------+----------
(0 rows)
cqlsh:test_keyspace> update conditional_updating
set firstname = 'John',
lastname = 'Doe'
WHERE id = 1 IF lastname != 'Doe';
[applied]
-----------
True
cqlsh:test_keyspace> select * from conditional_updating ;
id | firstname | lastname
----+-----------+----------
1 | John | Doe
(1 rows)
cqlsh:test_keyspace> update conditional_updating
set lastname = 'New'
WHERE id = 1 IF lastname != 'Doe';
[applied] | lastname
-----------+----------
False | Doe
Обратите внимание, что использование условия IF
неfree Под капотом запускается облегченная транзакция (LWT) (также известная как CAS для Compara и SET).Такие запросы требуют чтения и записи, а также достижения консенсуса среди всех реплик, что делает его немного обременительным.
"Но, пожалуйста, обратите внимание, что использование условий IF повлечет за собой немалые издержки производительности (внутренне, Paxos будет использоваться), так что это должно использоваться экономно".- Документация CQL - Обновление
Если вам интересно узнать, почему облегченные транзакции считаются антишаблоном в Кассандре, я призываю вас взглянутьздесь: Легкие транзакции в Кассандре