Questo comportamento in Cassandra sembra contro-intuitivo e voglio sapere perché questo sta accadendo, e forse aggirarlo.Cassandra TTL viene impostato su 0 sulla chiave primaria se non è specificato TTL su un aggiornamento, ma se lo è, il TTL sulla chiave primaria non cambia
Immaginate Ho una tabella con tre colonne: pk
, la chiave primaria, un tipo text
, foo
, un bigint
, e bar
, un'altra text
.
insert into keyspace.table (pk, foo, bar) values ('first', 1, 'test') using ttl 60;
Questo crea una riga nella mia tabella che ha un tempo di vita di 60 secondi. Guardando la cosa, sembra che questo:
pk | foo | bar
------------------
first | 1 | test
Ora faccio:
update keyspace.table using ttl 10 set bar='change' where pk='first';
E poi, guardando la fila, lo vedo subisce le seguenti modifiche:
pk | foo | bar
--------------------
first | 1 | change
first | 1 | <<null>> // after 10 seconds
<<deleted>> // after the initial 60 seconds
Tutto buona e giusta. Quello che volevo era che il tempo di vita di bar
cambiasse, ma nient'altro, soprattutto non la chiave primaria. Questo comportamento era previsto.
Tuttavia, se il mio aggiornamento non dispone di un ttl
in esso, o è impostato su 0:
update keyspace.table set bar='change' where pk='first';
poi vedo questo comportamento nel corso del tempo, invece.
pk | foo | bar
--------------------
first | 1 | change
first | 0 | change // after the initial 60 seconds
In altre parole, la riga non viene mai eliminata. foo
non è stato modificato, quindi il suo time-to-live era ancora in vigore e dopo che è passato il valore è stato cancellato (impostato su 0). Ma pk
ha avuto il suo time-to-live cambiato. Questo è totalmente inaspettato.
Perché la modifica del time-to-live della chiave primaria viene eseguita solo se non si specifica il time-to-live nell'aggiornamento? E come posso aggirare questo in modo che il tempo di vita della chiave primaria cambi solo se dico esplicitamente di farlo?
Modifica Ho anche scoperto che se uso un time-to-live che è superiore a quello iniziale, sembra anche che cambi il time-to-live sulla chiave primaria.
update keyspace.table using ttl 70 set bar='change' where pk='first';
pk | foo | bar
--------------------
first | 1 | change
first | 0 | change // after the initial 60 seconds
<<deleted>> // after the 70 seconds
Se è in uso una chiave primaria composta, cosa cambia? – OrangeDog
L'uso di una chiave primaria composta non dovrebbe cambiare nulla. Per quanto riguarda il modello di archiviazione di basso livello (Thrift), una chiave primaria composta è in realtà solo una tupla. Il mapping su colonne diverse a livello di CQL è solo zucchero sintattico. –
E se c'è una chiave di clustering? – OrangeDog