5

So che il modo per gestire la transazione di database sul motore dell'app è di assegnare a entità diverse lo stesso Parent (gruppo di entità) e di utilizzare db.run_in_transaction.Nel motore dell'app google, come posso implementare le transazioni del database?

Tuttavia, supponiamo che io sia non in grado di assegnare a due entità lo stesso genitore. Come posso assicurarmi che i miei aggiornamenti DB si verifichino in una transazione?

Esiste una soluzione tecnica? In caso contrario, c'è uno schema che posso applicare?

Nota: sto usando Python.

risposta

5

Fintanto che le entità appartengono allo stesso gruppo, questo non è un problema. Dal docs:

Tutte le operazioni datastore in una transazione devono operare sulle entità nello stesso gruppo entità. Questo include le query per le entità tramite l'antenato , il recupero delle entità tramite chiave, entità di aggiornamento e l'eliminazione delle entità . Si noti che ciascuna entità radice appartiene a un gruppo di entità separato, pertanto non può creare una singola transazione o operare su più di un'entità root. Per una spiegazione dei gruppi di entità, vedere Chiavi e gruppi di entità.

C'è anche un bell'articolo su Transaction Isolation in App Engine.

EDIT: Se è necessario aggiornare entità con genitori diversi nella stessa transazione, sarà necessario implementare un modo per serializzare le modifiche apportate manualmente e il rollback manualmente se viene sollevata un'eccezione.

+0

Ma se si seguono i "Tasti e entità gruppi" link http://code.google.com/appengine/docs/ python/datastore/keysandentitygroups.html # Entity_Groups_Ancestors_and_Paths, l'unico metodo elencato per mettere due Entità nello stesso Entity Group è quello di assicurarsi che condividano un antenato –

+0

Scusa, supponiamo tecnicamente che intendo Gruppi, non genitori. Ma sì, secondo il libro che sto leggendo sembra che l'unico modo per assegnare i gruppi in Python sia attraverso un antenato/genitore comune. – willem

+0

@James @Willem Avete entrambi ragione. Le entità sono considerate un gruppo solo se condividono lo stesso nodo radice/genitore. Ho modificato la mia risposta. – jbochi

2

Le transazioni nel datastore AppEngine si comportano in modo diverso rispetto alle transazioni a cui si può essere utilizzati in un database SQL. Per prima cosa, la transazione non blocca effettivamente le entità su cui sta operando.

L'articolo Translation Isolation in App Engine lo spiega in maggior dettaglio.

Per questo motivo, vorrai pensare in modo diverso alle transazioni: probabilmente troverai che nella maggior parte dei casi in cui desideri utilizzare una transazione non è necessario o non raggiungerebbe ciò che volere.

Per ulteriori informazioni sui gruppi di entità e sul modello di archivio dati, vedere How Entities and Indexes are Stored.

Handling Datastore Errors parla di cose che potrebbero impedire il commit di una transazione e come gestire i problemi.

2

Una possibilità è quella di implementare la gestione della transazione come hai menzionato. Se stai pensando di farlo, varrebbe il tuo tempo per esplorare il lavoro precedente su questo problema.

http://danielwilkerson.com/dist-trans-gae.html

Dan Wilkerson anche tenuto un discorso su di esso a Google IO. Dovresti riuscire a trovare un video del discorso.

+0

Molto utile, grazie Kris. – willem

3

Se si desidera eseguire transazioni tra gruppi di entità diverse, è necessario implementarle manualmente oppure attendere che una libreria esegua tali operazioni. Ho scritto un po 'di tempo fa an article su come implementare le transazioni del gruppo di entità incrociate nel caso del "bonifico bancario"; potrebbe valere anche per il tuo caso d'uso.

+0

+1 articolo molto bello! grazie! – jbochi

Problemi correlati