Une transaction est un ensemble d'opérations sur une ou plusieurs entités. Chaque transaction est atomique, ce qui signifie que les transactions ne sont jamais partiellement appliquées. Toutes les opérations de la transaction sont appliquées, ou aucune d'entre elles ne l'est.
Utiliser des transactions
Les transactions expirent au bout de 270 secondes ou si elles sont inactives pendant 60 secondes.
Une opération peut échouer lorsque :
- trop de modifications simultanées s'effectuent sur le même groupe d'entités ;
- la transaction dépasse une limite de ressources ;
- la base de données en mode Datastore rencontre une erreur interne.
Dans tous les cas précédents, l'API Cloud Datastore renvoie une erreur.
Les transactions sont une fonctionnalité facultative. Vous n'êtes pas obligé d'utiliser des transactions pour effectuer des opérations de base de données.
Une application peut exécuter un ensemble d'instructions et d'opérations au sein d'une même transaction. Ainsi, si une instruction ou une opération génère une exception, aucune des opérations de base de données de l'ensemble n'est appliquée. L'application définit les actions à effectuer dans la transaction.
L'extrait suivant indique comment effectuer une transaction. Il transfère de l'argent d'un compte à un autre.
C#
Pour savoir comment installer et utiliser la bibliothèque cliente pour Cloud Datastore, consultez Bibliothèques clientes Cloud Datastore. Pour en savoir plus, consultez les API C# Cloud Datastore documentation de référence.
Pour vous authentifier auprès de Cloud Datastore, configurez les identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Go
Pour savoir comment installer et utiliser la bibliothèque cliente pour Cloud Datastore, consultez Bibliothèques clientes Cloud Datastore. Pour en savoir plus, consultez les API Go Cloud Datastore documentation de référence.
Pour vous authentifier auprès de Cloud Datastore, configurez les identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Java
Pour savoir comment installer et utiliser la bibliothèque cliente pour Cloud Datastore, consultez Bibliothèques clientes Cloud Datastore. Pour en savoir plus, consultez les API Java Cloud Datastore documentation de référence.
Pour vous authentifier auprès de Cloud Datastore, configurez les identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Node.js
Pour savoir comment installer et utiliser la bibliothèque cliente pour Cloud Datastore, consultez Bibliothèques clientes Cloud Datastore. Pour en savoir plus, consultez les API Node.js Cloud Datastore documentation de référence.
Pour vous authentifier auprès de Cloud Datastore, configurez les identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
PHP
Pour savoir comment installer et utiliser la bibliothèque cliente pour Cloud Datastore, consultez Bibliothèques clientes Cloud Datastore. Pour en savoir plus, consultez les API PHP Cloud Datastore documentation de référence.
Pour vous authentifier auprès de Cloud Datastore, configurez les identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Python
Pour savoir comment installer et utiliser la bibliothèque cliente pour Cloud Datastore, consultez Bibliothèques clientes Cloud Datastore. Pour en savoir plus, consultez les API Python Cloud Datastore documentation de référence.
Pour vous authentifier auprès de Cloud Datastore, configurez les identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Ruby
Pour savoir comment installer et utiliser la bibliothèque cliente pour Cloud Datastore, consultez Bibliothèques clientes Cloud Datastore. Pour en savoir plus, consultez les API Ruby Cloud Datastore documentation de référence.
Pour vous authentifier auprès de Cloud Datastore, configurez les identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Veuillez noter que, pour la clarté de nos exemples, nous omettons parfois la commande rollback
en cas d'échec de la transaction. Dans le code de production, il est important de s'assurer que chaque transaction est validée ou annulée de façon explicite.
Que peut-on faire dans une transaction ?
Les transactions peuvent interroger ou rechercher n'importe quel nombre d'entités. La taille maximale d'un est de 10 Mio. Vous pouvez utiliser une transaction en lecture/écriture ou en lecture seule.
Isolation et cohérence
Les bases de données en mode Datastore appliquent l'isolation sérialisable. Cela signifie que les données lues ou modifiées par une transaction ne peuvent pas être modifiées simultanément.
Les requêtes et les recherches d'une transaction affichent un instantané cohérent de l'état de la base de données. Cet instantané contient l'effet de toutes les transactions et écritures terminées avant le début de la transaction.
Cet instantané cohérent englobe également les opérations de lecture ayant lieu après les opérations d'écriture dans les transactions. Contrairement à la plupart des bases de données, les requêtes et les recherches au sein d'une transaction en mode Datastore n'affichent pas les résultats des écritures précédentes dans cette transaction. Plus précisément, si une entité est modifiée ou supprimée au sein d'une transaction, une requête ou une recherche renvoie la version d'origine de l'entité au début de la transaction ou ne renvoie rien si l'entité n'existait pas à ce moment-là.
En dehors des transactions, les requêtes et les recherches ont également une isolation sérialisable.
Modes de simultanéité
Firestore en mode Datastore accepte trois modes de simultanéité. Le mode de simultanéité paramètre de base de données qui détermine l'interaction des transactions simultanées. Vous pouvez sélectionnez l'un des modes de simultanéité suivants:
Pessimiste
Les transactions en lecture-écriture utilisent des verrous lecteur-rédacteur pour appliquer l'isolation et la sérialisation. Lorsque deux transactions en lecture-écriture simultanées ou plus lisent ou écrire les mêmes données, le verrou détenu par une transaction peut retarder l'autre des transactions. Si votre transaction ne nécessite aucune écriture, vous pouvez utiliser une transaction en lecture seule pour améliorer les performances et éviter les conflits avec d'autres transactions. Les transactions en lecture seule ne permettent pas ne nécessitent aucun verrouillage.
Les bases de données Firestore en mode Datastore utilisent le mode de simultanéité pessimiste par défaut.
Optimiste
Lorsque deux transactions en lecture-écriture simultanées ou plus lisent ou écrivent le les mêmes données, seule la première transaction à valider ses modifications réussit. Les autres transactions qui effectuent des écritures échouent lors du commit.
Optimiste avec les groupes d'entités
N'utilisez ce mode de simultanéité que si dépend de la sémantique transactionnelle de groupe d'entités de l'ancienne version de Cloud Datastore. Ce mode de simultanéité impose des limites supplémentaires transactions:
- Les transactions sont limitées à 25 groupes d'entités.
- Les écritures dans un groupe d'entités sont limitées à 1 par seconde.
- Les requêtes dans les transactions doivent être des requêtes ascendantes.
Afficher le mode de simultanéité
Utiliser Firestore projects.databases Ressource REST pour afficher le mode de simultanéité de votre base de données:
curl -X GET -H "Authorization: Bearer "$(gcloud auth print-access-token) \
"https://firestore.googleapis.com/v1/projects/PROJECT_ID/databases"
Modifier le mode de simultanéité
Pour modifier le mode de simultanéité de votre base de données, envoyez une requête PATCH
à Firestore
projects.databases
Ressource REST:
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"
où :
- CONCURRENCY_MODE est
PESSIMISTIC
,OPTIMISTIC
ouOPTIMISTIC_WITH_ENTITY_GROUPS
. - PROJECT_ID est l'ID du projet Google Cloud.
Cas d'utilisation des transactions
Une utilisation des transactions consiste à mettre à jour une entité avec une nouvelle valeur de propriété par rapport à sa valeur actuelle. L'exemple transferFunds
ci-dessus effectue cette action pour deux entités, en retirant de l'argent d'un compte et en le transférant sur un autre.
L'API Datastore n'effectue pas de nouvelles tentatives de transactions. Toutefois, vous pouvez ajouter votre propre logique dans ce domaine, par exemple pour gérer les conflits lorsqu'une autre requête met à jour la même entité au même moment.
C#
Pour savoir comment installer et utiliser la bibliothèque cliente pour Cloud Datastore, consultez Bibliothèques clientes Cloud Datastore. Pour en savoir plus, consultez les API C# Cloud Datastore documentation de référence.
Pour vous authentifier auprès de Cloud Datastore, configurez les identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Go
Pour savoir comment installer et utiliser la bibliothèque cliente pour Cloud Datastore, consultez Bibliothèques clientes Cloud Datastore. Pour en savoir plus, consultez les API Go Cloud Datastore documentation de référence.
Pour vous authentifier auprès de Cloud Datastore, configurez les identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Java
Pour savoir comment installer et utiliser la bibliothèque cliente pour Cloud Datastore, consultez Bibliothèques clientes Cloud Datastore. Pour en savoir plus, consultez les API Java Cloud Datastore documentation de référence.
Pour vous authentifier auprès de Cloud Datastore, configurez les identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Node.js
Pour savoir comment installer et utiliser la bibliothèque cliente pour Cloud Datastore, consultez Bibliothèques clientes Cloud Datastore. Pour en savoir plus, consultez les API Node.js Cloud Datastore documentation de référence.
Pour vous authentifier auprès de Cloud Datastore, configurez les identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
PHP
Pour savoir comment installer et utiliser la bibliothèque cliente pour Cloud Datastore, consultez Bibliothèques clientes Cloud Datastore. Pour en savoir plus, consultez les API PHP Cloud Datastore documentation de référence.
Pour vous authentifier auprès de Cloud Datastore, configurez les identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Python
Pour savoir comment installer et utiliser la bibliothèque cliente pour Cloud Datastore, consultez Bibliothèques clientes Cloud Datastore. Pour en savoir plus, consultez les API Python Cloud Datastore documentation de référence.
Pour vous authentifier auprès de Cloud Datastore, configurez les identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Ruby
Pour savoir comment installer et utiliser la bibliothèque cliente pour Cloud Datastore, consultez Bibliothèques clientes Cloud Datastore. Pour en savoir plus, consultez les API Ruby Cloud Datastore documentation de référence.
Pour vous authentifier auprès de Cloud Datastore, configurez les identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Ici, une transaction est nécessaire, car la valeur balance
dans une entité peut être mise à jour par un autre utilisateur après que ce code a récupéré l'objet. Toutefois, cette opération doit s'effectuer avant qu'il n'enregistre l'objet modifié. En l'absence de transaction, la requête de l'utilisateur utilise la valeur balance
avant la mise à jour effectuée par l'autre utilisateur, puis la sauvegarde écrase la nouvelle valeur. Avec une transaction, l'application est prévenue de la mise à jour effectuée par l'autre utilisateur.
Une autre utilisation courante des transactions consiste à récupérer une entité avec une clé nommée ou de la créer si elle n'existe pas (cet exemple se base sur l'exemple TaskList illustré dans la section Créer une entité) :
C#
Pour savoir comment installer et utiliser la bibliothèque cliente pour Cloud Datastore, consultez Bibliothèques clientes Cloud Datastore. Pour en savoir plus, consultez les API C# Cloud Datastore documentation de référence.
Pour vous authentifier auprès de Cloud Datastore, configurez les identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Go
Pour savoir comment installer et utiliser la bibliothèque cliente pour Cloud Datastore, consultez Bibliothèques clientes Cloud Datastore. Pour en savoir plus, consultez les API Go Cloud Datastore documentation de référence.
Pour vous authentifier auprès de Cloud Datastore, configurez les identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Java
Pour savoir comment installer et utiliser la bibliothèque cliente pour Cloud Datastore, consultez Bibliothèques clientes Cloud Datastore. Pour en savoir plus, consultez les API Java Cloud Datastore documentation de référence.
Pour vous authentifier auprès de Cloud Datastore, configurez les identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Node.js
Pour savoir comment installer et utiliser la bibliothèque cliente pour Cloud Datastore, consultez Bibliothèques clientes Cloud Datastore. Pour en savoir plus, consultez les API Node.js Cloud Datastore documentation de référence.
Pour vous authentifier auprès de Cloud Datastore, configurez les identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
PHP
Pour savoir comment installer et utiliser la bibliothèque cliente pour Cloud Datastore, consultez Bibliothèques clientes Cloud Datastore. Pour en savoir plus, consultez les API PHP Cloud Datastore documentation de référence.
Pour vous authentifier auprès de Cloud Datastore, configurez les identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Python
Pour savoir comment installer et utiliser la bibliothèque cliente pour Cloud Datastore, consultez Bibliothèques clientes Cloud Datastore. Pour en savoir plus, consultez les API Python Cloud Datastore documentation de référence.
Pour vous authentifier auprès de Cloud Datastore, configurez les identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Ruby
Pour savoir comment installer et utiliser la bibliothèque cliente pour Cloud Datastore, consultez Bibliothèques clientes Cloud Datastore. Pour en savoir plus, consultez les API Ruby Cloud Datastore documentation de référence.
Pour vous authentifier auprès de Cloud Datastore, configurez les identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Comme précédemment, une transaction est nécessaire dans le cas où un autre utilisateur tente de créer ou de mettre à jour une entité avec le même ID de chaîne. Sans transaction, si l'entité n'existe pas et que deux utilisateurs tentent de la créer, la seconde remplace la première sans savoir ce qu'il s'est passé.
Lorsqu'une transaction échoue, vous pouvez demander à l'application de retenter la transaction jusqu'à ce qu'elle réussisse, ou laisser les utilisateurs traiter l'erreur en la propageant au niveau de l'interface utilisateur de l'application. Il n'est pas nécessaire de créer une boucle afin de retenter chaque transaction.
Transactions en lecture seule
Enfin, vous pouvez utiliser une transaction pour lire un instantané cohérent de la base de données. Cela peut s'avérer utile lorsque plusieurs opérations de lecture sont nécessaires pour afficher une page ou exporter des données qui doivent être cohérentes. Dans ce cas, vous pouvez créer une transaction en lecture seule.
Les transactions en lecture seule ne peuvent pas modifier les entités, mais en contrepartie, elles ne sont en conflit avec aucune autre transaction et n'ont pas besoin d'être relancées. Si vous n'effectuez que des lectures dans une transaction normale en lecture-écriture, cette transaction peut alors entrer en conflit avec une transaction qui modifie les mêmes données.
C#
Pour savoir comment installer et utiliser la bibliothèque cliente pour Cloud Datastore, consultez Bibliothèques clientes Cloud Datastore. Pour en savoir plus, consultez les API C# Cloud Datastore documentation de référence.
Pour vous authentifier auprès de Cloud Datastore, configurez les identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Go
Pour savoir comment installer et utiliser la bibliothèque cliente pour Cloud Datastore, consultez Bibliothèques clientes Cloud Datastore. Pour en savoir plus, consultez les API Go Cloud Datastore documentation de référence.
Pour vous authentifier auprès de Cloud Datastore, configurez les identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Java
Pour savoir comment installer et utiliser la bibliothèque cliente pour Cloud Datastore, consultez Bibliothèques clientes Cloud Datastore. Pour en savoir plus, consultez les API Java Cloud Datastore documentation de référence.
Pour vous authentifier auprès de Cloud Datastore, configurez les identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Node.js
Pour savoir comment installer et utiliser la bibliothèque cliente pour Cloud Datastore, consultez Bibliothèques clientes Cloud Datastore. Pour en savoir plus, consultez les API Node.js Cloud Datastore documentation de référence.
Pour vous authentifier auprès de Cloud Datastore, configurez les identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
PHP
Pour savoir comment installer et utiliser la bibliothèque cliente pour Cloud Datastore, consultez Bibliothèques clientes Cloud Datastore. Pour en savoir plus, consultez les API PHP Cloud Datastore documentation de référence.
Pour vous authentifier auprès de Cloud Datastore, configurez les identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Python
Pour savoir comment installer et utiliser la bibliothèque cliente pour Cloud Datastore, consultez Bibliothèques clientes Cloud Datastore. Pour en savoir plus, consultez les API Python Cloud Datastore documentation de référence.
Pour vous authentifier auprès de Cloud Datastore, configurez les identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Ruby
Pour savoir comment installer et utiliser la bibliothèque cliente pour Cloud Datastore, consultez Bibliothèques clientes Cloud Datastore. Pour en savoir plus, consultez les API Ruby Cloud Datastore documentation de référence.
Pour vous authentifier auprès de Cloud Datastore, configurez les identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Étape suivante
- Apprenez-en davantage sur les requêtes.