Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Lock:Relation
L'événement Lock:Relation
se produit lorsqu'une requête attend d'acquérir un verrou sur une table ou une vue (relation) actuellement verrouillée par une autre transaction.
Rubriques
Versions de moteur prises en charge
Ces informations sur les événements d'attente sont prises en charge pour toutes les versions d'Aurora PostgreSQL.
Contexte
La plupart des SQL commandes Postgre utilisent implicitement des verrous pour contrôler l'accès simultané aux données des tables. Vous pouvez également utiliser ces verrous explicitement dans le code de votre application grâce à la commande LOCK
. De nombreux modes de verrouillage ne sont pas compatibles entre eux et peuvent bloquer des transactions lorsqu'ils tentent d'accéder au même objet. Lorsque cela se produit, Aurora Postgre SQL génère un Lock:Relation
événement. Voici quelques exemples courants :
Des verrous exclusifs tels que
ACCESS EXCLUSIVE
peuvent bloquer tous les accès simultanés. Opérations du langage de définition des données (DDL) telles queDROP TABLE
,TRUNCATE
VACUUM FULL
, etCLUSTER
acquérir desACCESS EXCLUSIVE
verrous implicitement.ACCESS EXCLUSIVE
est également le mode de verrouillage par défaut pour lesLOCK TABLE
instructions qui ne spécifient pas de mode de manière explicite.L'utilisation
CREATE INDEX (without CONCURRENT)
sur une table entre en conflit avec les instructions du langage de manipulation des données (DML)UPDATE
DELETE
, etINSERT
, qui acquièrent desROW EXCLUSIVE
verrous.
Pour plus d'informations sur les verrous au niveau des tables et les modes de verrouillage conflictuels, consultez Explicit Locking
Le déblocage lié aux requêtes et transactions de blocage s'effectue généralement de l'une des manières suivantes :
Requête de blocage – L'application peut annuler la requête ou l'utilisateur peut mettre fin au processus. Le moteur peut également forcer la requête à se terminer en raison de l'expiration du délai d'attente d'une instruction de la session ou d'un mécanisme de détection de blocage.
Transaction de blocage – Une transaction met fin à son blocage lorsqu'elle exécute une instruction
ROLLBACK
ouCOMMIT
. Les restaurations sont également automatiques lorsque les sessions sont déconnectées par un client ou suite à des problèmes de réseau, ou lorsqu'elles sont interrompues. Les sessions peuvent être interrompues lorsque le moteur de base de données est arrêté, lorsque le système est à court de mémoire, etc.
Causes probables de l'allongement des temps d'attente
Lorsque l'événement Lock:Relation
se produit plus fréquemment que la normale, il peut indiquer un problème de performances. Les causes sont généralement les suivantes :
- Augmentation du nombre de sessions simultanées avec des verrous de table conflictuels
-
Le nombre de sessions simultanées peut augmenter lorsque des requêtes verrouillent la même table avec des modes de verrouillage conflictuels.
- Opérations de maintenance
-
Les opérations de maintenance liées à l'état comme
VACUUM
etANALYZE
peuvent considérablement augmenter le nombre de verrous en conflit.VACUUM FULL
acquiert un verrouACCESS EXCLUSIVE
, etANALYZE
acquiert un verrouSHARE UPDATE EXCLUSIVE
. Ces deux types de verrous peuvent provoquer un événement d'attenteLock:Relation
. Les opérations de maintenance des données d'application telles que l'actualisation d'une vue matérialisée peuvent également augmenter le nombre de requêtes et de transactions bloquées. - Verrous sur les instances de lecture
-
Il peut y avoir un conflit entre les verrous relationnels des volumes en écriture et des volumes en lecture. Actuellement, seuls les verrous relationnels
ACCESS EXCLUSIVE
sont répliqués vers les instances de lecture. Cependant, le verrou relationnelACCESS EXCLUSIVE
entrera en conflit avec tout verrou relationnelACCESS SHARE
détenu par le volume en lecture. Cela peut entraîner une augmentation des événements d'attente de relation de verrouillage sur le volume en lecture.
Actions
Nous vous recommandons différentes actions en fonction des causes de votre événement d'attente.
Rubriques
Réduisez l'impact du blocage SQL des déclarations
Pour réduire l'impact des SQL instructions de blocage, modifiez le code de votre application dans la mesure du possible. Voici deux techniques courantes pour réduire les blocages :
Utiliser l'
NOWAIT
option — Certaines SQL commandes, telles que lesLOCK
instructionsSELECT
et, prennent en charge cette option. La directiveNOWAIT
annule la requête liée à la demande de verrou si le verrou ne peut pas être acquis immédiatement. Cette technique permet d'éviter qu'une session de blocage ne provoque un empilement de sessions bloquées derrière elle.Par exemple, supposons que la transaction A attende un verrou détenu par la transaction B. Si B demande un verrou sur une table qui est verrouillée par la transaction C, la transaction A peut être bloquée jusqu'à ce que la transaction C se termine. Mais si la transaction B utilise
NOWAIT
lorsqu'elle demande le verrou sur C, elle peut échouer rapidement et faire en sorte que la transaction A n'ait pas à attendre indéfiniment.Utiliser
SET lock_timeout
— Définissez unelock_timeout
valeur pour limiter le temps d'attente d'une SQL instruction avant de verrouiller une relation. Si le verrou n'est pas acquis dans le délai spécifié, la transaction demandant le verrou est annulée. Définissez cette valeur au niveau de la session.
Minimisez l'effet des opérations de maintenance
Les opérations de maintenance telles que VACUUM
et ANALYZE
sont importantes. Nous vous recommandons de ne pas les désactiver parce que vous trouvez des événements d'attente Lock:Relation
liés à ces opérations de maintenance. Les approches suivantes peuvent minimiser l'effet de ces opérations :
Exécutez les opérations de maintenance manuellement pendant les heures creuses.
Pour réduire les attentes
Lock:Relation
causées par les tâches autovacuum, procédez aux réglages nécessaires de la fonction autovacuum. Pour plus d'informations sur le réglage de l'aspirateur automatique, consultez la section Utilisation de l'aspirateur SQL automatique Postgre sur Amazon RDS dans le guide de l'utilisateur Amazon RDS.
Recherchez les verrous de lecture
Vous pouvez déterminer comment des sessions ouvertes simultanément sur un dispositif d'écriture et un lecteur peuvent détenir des verrous qui se bloquent mutuellement. Une façon de le faire est d'exécuter des requêtes qui renvoient le type de verrou et la relation. Dans le tableau, vous pouvez trouver une séquence de requêtes pour deux sessions simultanées de ce type, une session de rédaction et une session de lecture.
Le processus de rediffusion attend la durée de max_standby_streaming_delay
avant d'annuler la requête du lecteur. Comme le montre l'exemple, le délai de verrouillage de 100 ms est bien inférieur au délai max_standby_streaming_delay
par défaut de 30 secondes. Le verrouillage s'arrête avant que cela ne devienne un problème.
Événement séquentiel | Session | Commande ou sortie |
---|---|---|
Définit une variable d'environnement appelée READER avec la valeur spécifiée et essaie de se connecter à l'instance de base de données avec ce point de terminaison. |
Session de lecture |
CLIcommande :
Sortie : psql (15devel, server 10.14) Type "help" for help. |
Définit une variable d'environnement appelée WRITER et essaie de se connecter à l'instance de base de données avec ce point de terminaison. |
Session d'écriture |
CLIcommande :
Sortie : psql (15devel, server 10.14) Type "help" for help. |
La session Writer crée la table t1 sur l'instance Writer. |
Session d'écriture |
SQLRequête Postgre :
|
S'il n'y a pas de requêtes contradictoires sur le rédacteur, le ACCESS EXCLUSIVE verrou est immédiatement acquis sur le rédacteur. |
Session d'écriture |
|
La session du lecture définit un intervalle d'expiration de 100 millisecondes pour le verrou. |
Session de lecture |
SQLRequête Postgre :
|
La session de lecture essaie de lire les données de la table t1 sur l'instance de lecteur. |
Session de lecture |
SQLRequête Postgre :
Exemple de sortie : b --- (0 rows) |
La session Writer perd t1. |
Session d'écriture |
SQLRequête Postgre :
|
La requête expire et est annulée sur le lecteur. |
Session de lecture |
SQLRequête Postgre :
Exemple de sortie : ERROR: canceling statement due to lock timeout LINE 1: SELECT * FROM t1; ^ |
Pour déterminer la cause de l'erreur, la session du lecteur interroge et |
Session de lecture |
SQLRequête Postgre :
|
Le résultat indique que le |
Session de lecture |
Résultat de la requête :
|