Ho una funzione, che fa più query sullo stesso set di dati e voglio assicurarmi che tutte le query vedano esattamente gli stessi dati.In Django, come ottenere letture ripetibili per una transazione?
In termini di SQL, questo significa REPEATABLE READ livello di isolamento per i database che lo supportano. Non mi dispiace avere un livello più alto o anche un blocco completo se il database non è in grado.
Per quanto vedo, questo non è il caso. Cioè se corro qualcosa di simile a questo codice in una shell Python:
with transaction.atomic():
for t in range(0, 60):
print("{0}: {1}".format(t, MyModel.objects.count()))
time.sleep(1)
Non appena faccio MyModel.objects.create(...)
in un altro, il valore visto con l'aumento del ciclo in esecuzione immediatamente. È esattamente quello che voglio evitare. Ulteriori test mostrano che il comportamento corrisponde al livello READ COMMITTED, che è troppo lassista per i miei gusti.
Vorrei anche sottolineare il punto, voglio un livello di isolamento più rigoroso solo per una singola funzione, non per l'intero progetto.
Quali sono le opzioni migliori per raggiungere questo obiettivo?
Nel mio caso particolare, l'unico database a cui tengo è PostgreSQL 9.3+, ma voglio anche una certa compatibilità con SQLite3 nel qual caso anche il blocco completo dell'intero database va bene per me. Eppure, ovviamente, più la soluzione è generale, più è preferita.
la memorizzazione nella cache di questi metadati è un approccio accettabile? –
Purtroppo no. Le query che faccio calcolano varie statistiche sui dati degli eventi grezzi e per avere una vista coerente, dovrò trascinare l'intero set di dati in memoria, che è qualcosa che non voglio davvero fare. – drdaeman