Ho bisogno di aggiornare un contatore e restituire il conteggio corrente. Sto seguendo l'esempio qui: https://developers.google.com/appengine/articles/sharding_counters
Ma non sono sicuro di poter eseguire indirettamente una query transazionale tramite una funzione. Ecco il codice di esempio:
@db.transactional
def updateCounter(name):
increment(name)
get_count(name)
updateCounter(TOTAL_USERS)
Questo restituirà il conteggio corrente incrementato? o questo approccio non è valido in quanto la query del database si trova all'esterno della funzione @ db.transactional?
risposte:
3 per risposta № 1Non è possibile* per ottenere un conteggio delle transazioni di un contatore di dimensioni ridotte. Il modo in cui funzionano i contatori semplificati è che è possibile aggiornarli in una transazione e riassumerli al di fuori della transazione. Generalmente, questo non è un problema, perché i contatori sharded sono usati dove il conteggio viene aggiornato molte volte al secondo, qualsiasi record transazionale del conteggio sarebbe errato praticamente nel momento in cui è stato calcolato.
* tu poteva fai questo per un massimo di 5 frammenti usando XGtransazioni, ma è una pessima idea, in primo luogo, per le ragioni di cui sopra, e in secondo luogo perché imporrebbe gli stessi problemi di scalabilità che stai cercando di evitare utilizzando in primo luogo i contatori in grassetto.
0 per risposta № 2
Puoi usa solo le query degli antenati all'interno di una transazione.
Da get_count()
usa la query non-antenato il suo codice produrrà un errore.