Una transazione è un insieme di operazioni su una o più entità. Ogni transazione è garantita come atomica, il che significa che le transazioni non vengono mai applicate parzialmente. Vengono applicate tutte le operazioni nella transazione o nessuna.
Utilizzo delle transazioni
Le transazioni scadono dopo 270 secondi o se rimangono inattive per 60 secondi.
Un'operazione potrebbe non riuscire quando:
- Vengono tentate troppe modifiche simultanee alla stessa entità.
- La transazione supera un limite di risorse.
- Il database in modalità Datastore rileva un errore interno.
In tutti questi casi, l'API Datastore restituisce un errore.
Le transazioni sono una funzionalità facoltativa. Non è necessario utilizzare le transazioni per eseguire operazioni sul database.
Un'applicazione può eseguire un insieme di istruzioni e operazioni in un'unica transazione, in modo che se un'istruzione o un'operazione genera un'eccezione, nessuna delle operazioni del database nel set viene applicata. L'applicazione definisce le azioni da eseguire nella transazione.
Il seguente snippet mostra come eseguire una transazione. Trasferisce denaro da un conto all'altro.
C#
Per scoprire come installare e utilizzare la libreria client per Cloud Datastore, consulta Librerie client di Cloud Datastore. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Cloud Datastore C#.
Per autenticarti a Cloud Datastore, configura le Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Go
Per scoprire come installare e utilizzare la libreria client per Cloud Datastore, consulta Librerie client di Cloud Datastore. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Cloud Datastore Go.
Per autenticarti a Cloud Datastore, configura le Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Java
Per scoprire come installare e utilizzare la libreria client per Cloud Datastore, consulta Librerie client di Cloud Datastore. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Cloud Datastore Java.
Per autenticarti a Cloud Datastore, configura le Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Node.js
Per scoprire come installare e utilizzare la libreria client per Cloud Datastore, consulta Librerie client di Cloud Datastore. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Cloud Datastore Node.js.
Per autenticarti a Cloud Datastore, configura le Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
PHP
Per scoprire come installare e utilizzare la libreria client per Cloud Datastore, consulta Librerie client di Cloud Datastore. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Cloud Datastore PHP.
Per autenticarti a Cloud Datastore, configura le Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Python
Per scoprire come installare e utilizzare la libreria client per Cloud Datastore, consulta Librerie client di Cloud Datastore. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Cloud Datastore Python.
Per autenticarti a Cloud Datastore, configura le Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Ruby
Per scoprire come installare e utilizzare la libreria client per Cloud Datastore, consulta Librerie client di Cloud Datastore. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Cloud Datastore Ruby.
Per autenticarti a Cloud Datastore, configura le Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Tieni presente che, per mantenere i nostri esempi più concisi, a volte omettiamo rollback
se la transazione non va a buon fine. Nel codice di produzione, è importante assicurarsi che ogni transazione venga eseguita esplicitamente o venga eseguito il rollback.
Cosa si può fare in una transazione
Le transazioni possono eseguire query o cercare qualsiasi numero di entità. La dimensione massima di una transazione è 10 MiB. Puoi utilizzare una transazione di lettura/scrittura o una transazione di sola lettura.
Isolamento e coerenza
I database in modalità Datastore applicano l'isolamento serializzabile. I dati letti o modificati da una transazione non possono essere modificati contemporaneamente.
Le query e le ricerche in una transazione mostrano uno snapshot coerente dello stato del database. Questo snapshot contiene l'effetto di tutte le transazioni e le scritture completate prima dell'inizio della transazione.
Questa vista istantanea coerente si estende anche alle letture dopo le scritture all'interno delle transazioni. A differenza della maggior parte dei database, le query e le ricerche all'interno di una transazione in modalità Datastore non vedono i risultati delle scritture precedenti all'interno della transazione. Nello specifico, se un'entità viene modificata o eliminata all'interno di una transazione, una query o una ricerca restituisce la versione originale dell'entità dall'inizio della transazione o nessuna entità se non esisteva.
Al di fuori delle transazioni, anche le query e le ricerche hanno isolamento serializzabile.
Modalità di concorrenza
Firestore in modalità Datastore supporta tre modalità di concorrenza. La modalità di concorrenza è un'impostazione del database che determina la modalità di interazione delle transazioni concorrenti. Puoi selezionare una delle seguenti modalità di concorrenza:
Pessimista
Le transazioni di lettura/scrittura utilizzano i blocchi di lettura/scrittura per applicare l'isolamento e la serializzabilità. Quando due o più transazioni di lettura/scrittura simultanee leggono o scrivono gli stessi dati, il blocco detenuto da una transazione può ritardare le altre transazioni. Se la transazione non richiede scritture, puoi migliorare le prestazioni ed evitare conflitti con altre transazioni utilizzando una transazione di sola lettura. Le transazioni di sola lettura non richiedono alcun blocco.
Per impostazione predefinita, i database Firestore in modalità Datastore utilizzano la modalità di concorrenza pessimistica.
Ottimistico
Quando due o più transazioni di lettura/scrittura simultanee leggono o scrivono gli stessi dati, viene eseguita solo la prima transazione che applica le modifiche. Le altre transazioni che eseguono scritture non riescono al commit.
Optimisti con i gruppi di entità
Utilizza questa modalità di concorrenza solo se la tua app dipende dalla semantica transazionale dei gruppi di entità del precedente Cloud Datastore. Questa modalità di concorrenza impone limiti aggiuntivi alle transazioni:
- Le transazioni sono limitate a 25 gruppi di entità.
- Le scritture a un gruppo di entità sono limitate a 1 al secondo.
- Le query nelle transazioni devono essere query di ancestro.
Per rimuovere le limitazioni di throughput di query, transazioni e scrittura di
OPTIMISTIC_WITH_ENTITY_GROUPS
, imposta la modalità di concorrenza del progetto su ottimistica. Per assicurarti che questa modifica sia compatibile con il tuo progetto:Crea un progetto di test in Firestore in modalità Datastore.
Modifica la modalità di concorrenza del progetto di test in
OPTIMISTIC
. Invia una richiesta HTTP PATCH come mostrato di seguito.Esegui test sul progetto di test per assicurarti che il tuo carico di lavoro funzioni come previsto senza i gruppi di entità.
Modifica la modalità di concorrenza del progetto principale da
OPTIMISTIC_WITH_ENTITY_GROUPS
aOPTIMISTIC
.
Visualizza la modalità di concorrenza
Utilizza la risorsa REST Firestore projects.databases per visualizzare la modalità di concorrenza del database:
curl -X GET -H "Authorization: Bearer "$(gcloud auth print-access-token) \
"https://firestore.googleapis.com/v1/projects/PROJECT_ID/databases"
Modificare la modalità di concorrenza
Per modificare la modalità di concorrenza del database, invia una richiesta PATCH
alla risorsa REST Firestore
projects.databases:
curl --request PATCH \
--header "Authorization: Bearer "$(gcloud auth print-access-token) \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{"concurrencyMode":"CONCURRENCY_MODE"}' \
"https://firestore.googleapis.com/v1/projects/PROJECT_ID/databases/(default)?updateMask=concurrencyMode"
dove:
- CONCURRENCY_MODE è
PESSIMISTIC
,OPTIMISTIC
oOPTIMISTIC_WITH_ENTITY_GROUPS
. - PROJECT_ID è l'ID del tuo progetto Google Cloud.
Utilizzi per le transazioni
Un utilizzo delle transazioni è l'aggiornamento di un'entità con un nuovo valore della proprietà rispetto al suo valore corrente. L'esempio transferFunds
riportato sopra esegue questa operazione per due persone giuridiche, prelevando denaro da un conto e trasferendolo in un altro.
L'API Datastore non riprova automaticamente le transazioni, ma puoi aggiungere la tua logica per riprovarle, ad esempio per gestire i conflitti quando un'altra richiesta aggiorna la stessa entità contemporaneamente.
C#
Per scoprire come installare e utilizzare la libreria client per Cloud Datastore, consulta Librerie client di Cloud Datastore. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Cloud Datastore C#.
Per autenticarti a Cloud Datastore, configura le Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Go
Per scoprire come installare e utilizzare la libreria client per Cloud Datastore, consulta Librerie client di Cloud Datastore. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Cloud Datastore Go.
Per autenticarti a Cloud Datastore, configura le Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Java
Per scoprire come installare e utilizzare la libreria client per Cloud Datastore, consulta Librerie client di Cloud Datastore. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Cloud Datastore Java.
Per autenticarti a Cloud Datastore, configura le Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Node.js
Per scoprire come installare e utilizzare la libreria client per Cloud Datastore, consulta Librerie client di Cloud Datastore. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Cloud Datastore Node.js.
Per autenticarti a Cloud Datastore, configura le Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
PHP
Per scoprire come installare e utilizzare la libreria client per Cloud Datastore, consulta Librerie client di Cloud Datastore. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Cloud Datastore PHP.
Per autenticarti a Cloud Datastore, configura le Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Python
Per scoprire come installare e utilizzare la libreria client per Cloud Datastore, consulta Librerie client di Cloud Datastore. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Cloud Datastore Python.
Per autenticarti a Cloud Datastore, configura le Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Ruby
Per scoprire come installare e utilizzare la libreria client per Cloud Datastore, consulta Librerie client di Cloud Datastore. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Cloud Datastore Ruby.
Per autenticarti a Cloud Datastore, configura le Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Ciò richiede una transazione perché il valore di balance
in un'entità può essere aggiornato da un altro utente dopo che questo codice ha recuperato l'oggetto, ma prima di salvarlo. Senza una transazione, la richiesta dell'utente utilizza il valore di balance
precedente all'aggiornamento dell'altro utente e il salvataggio sovrascrive il nuovo valore. Con una
transazione, l'applicazione viene informata dell'aggiornamento dell'altro utente.
Un altro uso comune delle transazioni è recuperare un'entità con una chiave denominata o crearla se non esiste ancora (questo esempio si basa sull'esempio TaskList della creazione di un'entità):
C#
Per scoprire come installare e utilizzare la libreria client per Cloud Datastore, consulta Librerie client di Cloud Datastore. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Cloud Datastore C#.
Per autenticarti a Cloud Datastore, configura le Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Go
Per scoprire come installare e utilizzare la libreria client per Cloud Datastore, consulta Librerie client di Cloud Datastore. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Cloud Datastore Go.
Per autenticarti a Cloud Datastore, configura le Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Java
Per scoprire come installare e utilizzare la libreria client per Cloud Datastore, consulta Librerie client di Cloud Datastore. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Cloud Datastore Java.
Per autenticarti a Cloud Datastore, configura le Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Node.js
Per scoprire come installare e utilizzare la libreria client per Cloud Datastore, consulta Librerie client di Cloud Datastore. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Cloud Datastore Node.js.
Per autenticarti a Cloud Datastore, configura le Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
PHP
Per scoprire come installare e utilizzare la libreria client per Cloud Datastore, consulta Librerie client di Cloud Datastore. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Cloud Datastore PHP.
Per autenticarti a Cloud Datastore, configura le Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Python
Per scoprire come installare e utilizzare la libreria client per Cloud Datastore, consulta Librerie client di Cloud Datastore. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Cloud Datastore Python.
Per autenticarti a Cloud Datastore, configura le Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Ruby
Per scoprire come installare e utilizzare la libreria client per Cloud Datastore, consulta Librerie client di Cloud Datastore. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Cloud Datastore Ruby.
Per autenticarti a Cloud Datastore, configura le Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Come in precedenza, è necessaria una transazione per gestire il caso in cui un altro utente stia tentando di creare o aggiornare un'entità con lo stesso ID stringa. Senza una transazione, se l'entità non esiste e due utenti tentano di crearla, il secondo sovrascrive la prima senza sapere che è successo.
Quando una transazione non va a buon fine, puoi chiedere all'app di riprovare finché non va a buon fine oppure puoi lasciare che siano gli utenti a gestire l'errore trasmettendolo al livello dell'interfaccia utente dell'app. Non è necessario creare un ciclo di ripetizione per ogni transazione.
Transazioni di sola lettura
Infine, puoi utilizzare una transazione per leggere uno snapshot coerente del database. Questa opzione può essere utile quando hai bisogno di più letture per visualizzare una pagina o per esportare dati che devono essere coerenti. Puoi creare transazioni di sola lettura per queste richieste.
Le transazioni di sola lettura non possono modificare le entità, ma in cambio non entrano in conflitto con altre transazioni e non è necessario ripeterle. Se effettui solo letture in una transazione di lettura/scrittura normale, questa transazione potrebbe entrare in conflitto con una transazione che modifica gli stessi dati.
C#
Per scoprire come installare e utilizzare la libreria client per Cloud Datastore, consulta Librerie client di Cloud Datastore. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Cloud Datastore C#.
Per autenticarti a Cloud Datastore, configura le Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Go
Per scoprire come installare e utilizzare la libreria client per Cloud Datastore, consulta Librerie client di Cloud Datastore. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Cloud Datastore Go.
Per autenticarti a Cloud Datastore, configura le Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Java
Per scoprire come installare e utilizzare la libreria client per Cloud Datastore, consulta Librerie client di Cloud Datastore. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Cloud Datastore Java.
Per autenticarti a Cloud Datastore, configura le Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Node.js
Per scoprire come installare e utilizzare la libreria client per Cloud Datastore, consulta Librerie client di Cloud Datastore. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Cloud Datastore Node.js.
Per autenticarti a Cloud Datastore, configura le Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
PHP
Per scoprire come installare e utilizzare la libreria client per Cloud Datastore, consulta Librerie client di Cloud Datastore. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Cloud Datastore PHP.
Per autenticarti a Cloud Datastore, configura le Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Python
Per scoprire come installare e utilizzare la libreria client per Cloud Datastore, consulta Librerie client di Cloud Datastore. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Cloud Datastore Python.
Per autenticarti a Cloud Datastore, configura le Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Ruby
Per scoprire come installare e utilizzare la libreria client per Cloud Datastore, consulta Librerie client di Cloud Datastore. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Cloud Datastore Ruby.
Per autenticarti a Cloud Datastore, configura le Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Passaggi successivi
- Scopri di più sulle query.