Les transactions Spanner proposent deux modes de contrôle de simultanéité : pessimiste et optimiste. Le choix du mode de contrôle de simultanéité affecte la façon dont les transactions gèrent les lectures et les écritures simultanées, ce qui a une incidence sur les performances, la latence et les taux d'abandon des transactions. Choisissez le mode qui correspond le mieux aux exigences de performances et de cohérence de votre application.
Le comportement par défaut dépend du niveau d'isolation utilisé par votre transaction :
- L'isolation sérialisable utilise le contrôle de simultanéité pessimiste par défaut.
- L'isolation de lecture répétée, utilise le contrôle de simultanéité optimiste par défaut.
Contrôle de simultanéité pessimiste
Par défaut, Spanner utilise la simultanéité pessimiste avec l'isolation sérialisable. Vous pouvez également utiliser la simultanéité pessimiste avec l'isolation de lecture répétée.
Simultanéité pessimiste dans l'isolation sérialisable
Ce mode suppose que les transactions simultanées peuvent se disputer les mêmes données. Il acquiert des verrous de manière proactive sur les données lorsqu'elles sont lues ou écrites dans une transaction. Il vérifie également que les verrous acquis plus tôt dans la transaction restent actifs dans les instructions ultérieures. Lorsque Spanner détecte un conflit de verrouillage, il utilise l'algorithme wound-wait pour le résoudre.
Dans la simultanéité pessimiste, les transactions acquièrent des verrous sur les données pendant les phases d'exécution et de commit de la transaction.
- Pour les lectures : lorsqu'une transaction lit des données, elle acquiert un
verrou de lecture partagé (
ReaderShared) pendant la phase d'exécution. Ces verrous sont conservés jusqu'à ce que la transaction soit validée. - Pour le LMD et les écritures
- Lors de l'exécution, pour les données modifiées par le LMD ou les écritures, la transaction peut acquérir des verrous de lecture sur l'existence de la ligne.
- Au moment du commit, la transaction tente d'acquérir des verrous d'écriture ou exclusifs pour les données écrites. Les verrous d'écriture bloquent les lectures simultanées, mais peuvent ne pas bloquer les écritures simultanées, en particulier lorsqu'elles utilisent toutes les deux des verrous d'écriture. Cela signifie que plusieurs transactions peuvent être validées, et que les conflits d'écriture sont résolus au moment du commit à l'aide de l'algorithme wound-wait. Tous les verrous sont conservés jusqu'à ce que la transaction soit validée.
Simultanéité pessimiste dans l'isolation de lecture répétée
Utilisez la simultanéité pessimiste dans l'isolation de lecture répétée pour sérialiser les écritures. Dans ce mode, les opérations de lecture utilisent des instantanés, mais
des verrous exclusifs
s'appliquent aux données lues à partir de requêtes FOR UPDATE ou d'indices
lock_scanned_ranges=exclusive ainsi qu'aux données écrites avec des requêtes LMD.
Avantages de la simultanéité pessimiste avec l'isolation sérialisable
Le principal avantage de l'utilisation de la simultanéité pessimiste avec l'isolation sérialisable est que, dans les charges de travail très conflictuelles, elle permet aux transactions de progresser. Spanner donne la priorité aux transactions plus anciennes par rapport aux plus récentes en cas de conflit, ce qui garantit que les transactions finissent par se terminer tout en réduisant le nombre de transactions abandonnées de manière répétée.
Avantages de la simultanéité pessimiste avec l'isolation de lecture répétée
Avec l'isolation de lecture répétée, les transactions qui acquièrent des verrous peuvent toujours être abandonnées au moment du commit si les données lues dans le cadre d'une requête avec FOR UPDATE ou d'une requête LMD ont été modifiées par une transaction simultanée avant le commit de la transaction. Toutefois, une fois les verrous acquis, elle empêche d'autres mises à jour simultanées jusqu'à ce que la transaction soit validée, ce qui sérialise les écritures.
Risques liés à la simultanéité pessimiste
La simultanéité pessimiste avec l'isolation sérialisable présente les risques suivants :
- Les lectures de longue durée peuvent bloquer les écritures sensibles à la latence.
- Les transactions qui impliquent une interaction utilisateur avant la fin peuvent entraîner le maintien des verrous pendant une longue période, ce qui peut bloquer d'autres opérations.
Cas d'utilisation de la simultanéité pessimiste avec l'isolation sérialisable
La simultanéité pessimiste convient aux charges de travail avec une forte contention en lecture-écriture et en écriture-écriture. Elle est également appropriée lorsque les abandons et les nouvelles tentatives de transaction sont coûteux. Utilisez ce mode par défaut, sauf si votre charge de travail présente des retards de verrouillage excessifs ou si elle est fortement affectée par des conflits de verrouillage.
Cas d'utilisation de la simultanéité pessimiste avec l'isolation de lecture répétée
Utilisez la simultanéité pessimiste avec la lecture répétée pour les charges de travail qui nécessitent une clause FOR UPDATE ou des requêtes LMD pour acquérir des verrous. Cette approche est particulièrement utile pour les charges de travail migrées vers Spanner à partir d'autres bases de données qui acquièrent des verrous pour ces instructions.
Contrôle de simultanéité optimiste
Spanner fournit également un contrôle de simultanéité optimiste. Lorsque vous utilisez l'isolation de lecture répétée, le mode par défaut est le contrôle de simultanéité optimiste. Vous pouvez également configurer l'isolation sérialisable pour utiliser le contrôle de simultanéité optimiste.
Le contrôle de simultanéité optimiste suppose que les conflits sont rares. Les lectures et les requêtes, même au sein d'une transaction en lecture-écriture, se poursuivent sans acquérir de verrous.
Avec l'isolation sérialisable par défaut de Spanner, les lectures sont validées au moment du commit. Cela garantit qu'aucune autre transaction validée simultanément n'a modifié les données précédemment lues par la transaction. Si vous utilisez
l'isolation de lecture répétée,
les lectures avec un indice FOR UPDATE ou lock_scanned_ranges=exclusive sont
validées au moment du commit. Si Spanner détecte un conflit, il abandonne la transaction.
Fonctionnement de la simultanéité optimiste
La simultanéité optimiste modifie la façon dont Spanner exécute les lectures, les requêtes et les commits de transactions. Elle effectue une exécution sans verrouillage pendant la phase de lecture et valide la cohérence au moment du commit.
Pour les lectures et les requêtes
Les lectures et les requêtes sont sans verrouillage. Toutes les lectures et requêtes d'une transaction optimiste s'exécutent à un seul code temporel d'instantané. Spanner choisit ce code temporel lors de l'exécution de la première lecture ou requête. Cela garantit que toutes les lectures et requêtes ultérieures de la transaction voient les écritures validées avant la première lecture ou requête.
Pour les lectures et les écritures
Pour une transaction optimiste avec des lectures et des écritures, Spanner effectue une étape de validation au moment du commit. La transaction n'est validée que si aucun conflit n'est détecté et que les conditions suivantes sont remplies :
- Aucune écriture validée simultanément n'est en conflit avec les données lues par cette transaction. Autrement dit, aucune écriture n'a été validée après le code temporel de lecture, mais avant que cette transaction ne valide ses propres écritures.
- Le schéma n'a pas été modifié depuis le code temporel de lecture.
Le niveau d'isolation détermine l'ensemble des lectures validées. Avec l'isolation sérialisable, toutes les lectures sont validées. Avec l'isolation de lecture répétée, les lectures avec un indice FOR UPDATE ou lock_scanned_ranges=exclusive sont validées au moment du commit.
En cas de forte contention, les transactions optimistes peuvent être abandonnées de manière répétée. En revanche, les transactions pessimistes résolvent les conflits de lecture-écriture en autorisant la validation de la transaction la plus ancienne et en relançant la transaction la plus récente.
Avantages de la simultanéité optimiste
La simultanéité optimiste offre les avantages suivants :
- Les lectures n'acquièrent pas de verrous : les transactions optimistes n'acquièrent pas de verrous pour les lectures. Par conséquent, les lectures de longue durée ne bloquent pas les écritures sensibles à la latence.
- Latence de commit réduite pour les transactions en lecture seule : étant donné que toutes les lectures d'une transaction optimiste sont basées sur le même code temporel d'instantané, il n'est pas nécessaire de vérifier la cohérence lors de l'exécution ou du commit de ces lectures, ce qui réduit considérablement la latence.
Risques liés à la simultanéité optimiste
La simultanéité optimiste présente des risques, en particulier en cas de forte contention en lecture-écriture lorsqu'elle est utilisée avec l'isolation sérialisable. Comprenez ces risques avant d'utiliser le contrôle de simultanéité optimiste avec l'isolation sérialisable pour votre charge de travail.
- En cas de forte contention en lecture-écriture, les transactions optimistes peuvent présenter un taux d'abandon élevé, car les écritures simultanées peuvent invalider les lectures d'une transaction optimiste.
- En cas de contention élevée persistante, une transaction peut être abandonnée de manière répétée et ne jamais être validée en raison d'un manque de transactions.
Cas d'utilisation de la simultanéité optimiste
La simultanéité optimiste convient aux charges de travail transactionnelles avec une faible contention en lecture-écriture. Pour les transactions sérialisables, elle est également avantageuse pour les charges de travail qui peuvent tolérer les abandons de transactions.
Envisagez la simultanéité optimiste pour les charges de travail suivantes :
- Charges de travail à faible priorité et tolérantes à la latence avec des transactions de longue durée : utilisez la simultanéité optimiste si les lectures ou requêtes de longue durée peuvent retarder les écritures sensibles à la latence. Cela évite les retards causés par les verrous de lecture. Par exemple, les transactions dans les clients mobiles avec des connexions lentes ou les transactions à faible contrat de niveau de service qui conservent des verrous de lecture pour de nombreuses lignes ou de grandes plages.
- Charges de travail transactionnelles sensibles à la latence de lecture avec une faible contention en lecture-écriture Dans une configuration multirégionale, utilisez la simultanéité optimiste pour diffuser les lectures au niveau régional, réduire les latences de lecture, et éviter les problèmes de production liés à un trafic de lecture irrégulier vers une division à chaud. Elle améliore également la disponibilité en lecture en cas de surcharge ou d'indisponibilité du responsable.
- Charges de travail transactionnelles où la plupart des transactions sont en lecture seule : le passage à la simultanéité optimiste réduit la latence de commit pour les transactions courantes en lecture seule dans ces charges de travail. Assurez-vous d'une faible contention en lecture-écriture pour éviter des taux d'abandon élevés pour les transactions en lecture-écriture.
Évitez d'utiliser la simultanéité optimiste pour les charges de travail transactionnelles sensibles à la latence où les conflits de lecture-écriture sont fréquents.
Configurer le contrôle de simultanéité
Vous pouvez utiliser les bibliothèques clientes Spanner, REST et l'API RPC pour spécifier le mode de simultanéité des transactions en lecture-écriture.
Bibliothèques clientes
Java
Go
Node.js
Python
C#
C++
REST
L'API REST TransactionOptions
de Spanner fournit une énumération ReadLockMode dans le message ReadWrite qui
vous permet de sélectionner le mode de verrouillage PESSIMISTIC ou OPTIMISTIC.
RPC
L'API RPC Transactionoptions
de Spanner fournit une énumération ReadLockMode dans le message ReadWrite qui
vous permet de sélectionner le mode de verrouillage PESSIMISTIC ou OPTIMISTIC.
Pilotes
Vous pouvez utiliser les pilotes de Spanner pour définir read_lock_mode comme paramètre de connexion au niveau de la connexion ou comme option d'instruction SET au niveau de la transaction. Pour en savoir plus sur chaque pilote, consultez
la présentation des pilotes.
Étape suivante
- En savoir plus sur les niveaux d'isolation de Spanner.
- Découvrez comment utiliser l'isolation de lecture répétée.