PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 16.2 » Administration du serveur » Configuration du serveur » Gestion des verrous

20.12. Gestion des verrous #

deadlock_timeout (integer) #

Durée totale d'attente d'un verrou avant de tester une condition de verrou mort (deadlock). Le test de verrou mort est très coûteux, le serveur ne l'effectue donc pas à chaque fois qu'il attend un verrou. Les développeurs supposent (de façon optimiste ?) que les verrous morts sont rares dans les applications en production et attendent simplement un verrou pendant un certain temps avant de lancer une recherche de blocage. Augmenter cette valeur réduit le temps perdu en recherches inutiles de verrous morts mais retarde la détection de vraies erreurs de verrous morts. Si cette valeur est indiquée sans unité, elle est comprise comme un nombre de millisecondes. La valeur par défaut est une seconde (1s), ce qui est probablement la plus petite valeur pratique. Sur un serveur en pleine charge, elle peut être augmentée. Idéalement, ce paramétrage doit dépasser le temps typique d'une transaction de façon à augmenter la probabilité qu'un verrou soit relâché avant que le processus en attente ne décide de lancer une recherche de verrous morts. Seuls les superutilisateurs et les utilisateurs disposant des droits SET adéquats peuvent modifier cette configuration.

Quand log_lock_waits est configuré, ce paramètre détermine aussi la durée d'attente avant qu'un message ne soit enregistré dans les journaux concernant cette attente. Pour comprendre ces délais de verrouillage, il peut être utile de configurer deadlock_timeout à une valeur extraordinairement basse.

max_locks_per_transaction (integer) #

La table des verrous partagés dispose d'un espace pour max_locks_per_transaction objets (par exemple, des tables) par processus serveur ou transaction préparée. Donc pas plus de ce nombre d'objets distincts peuvent être verrouillés à la fois. Ce paramètre limite le nombre moyen de verrous d'objets utilisés par chaque transaction ; les transactions individuelles peuvent verrouiller plus d'objets tant que les verrous de toutes les transactions peuvent être contenus dans la table des verrous. Cette valeur est illimitée. La valeur par défaut, 64, s'est avérée suffisante par le passé, mais vous devrez peut-être augmenter cette valeur si vous avez des requêtes qui utilisent de nombreuses tables différentes au cours d'une même transaction, par exemple une requête sur une table parent avec plusieurs enfants. Ce paramètre ne peut être défini qu'au démarrage du serveur.

Lors de l'exécution d'un serveur en attente, vous devez configurer ce paramètre à la même valeur ou à une valeur plus importante que sur le serveur primaire. Sinon, des requêtes pourraient ne pas être autorisées sur le serveur en attente.

max_pred_locks_per_transaction (integer) #

La table partagée de verrouillage avec prédicat dispose d'un espace pour max_pred_locks_per_transaction objets (par exemple, des tables) par processus serveur ou transaction préparée ; Du coup, pas plus que ce nombre d'objets distincts peut être verrouillé à un instant. Ce paramètre limite le nombre moyen de verrous d'objet utilisés pour chaque transaction ; les transactions individuelles peuvent verrouiller plus d'objets à condition que les verrous de toutes les transactions tiennent dans la table des verrous. Ce n'est pas le nombre de lignes qui peuvent être verrouillées, cette valeur étant illimitée. La valeur par défaut, 64, a prouvé être suffisante dans les tests mais vous pouvez avoir besoin d'augmenter cette valeur si vous avez des clients qui touchent beaucoup de tables différentes dans une seule transaction sérialisable. Ce paramètre n'est configurable qu'au lancement du serveur.

max_pred_locks_per_relation (integer) #

Cela contrôle le nombre de pages ou de lignes d'une unique relation peut verrouiller au niveau du prédicat avant que le verrou soit promis pour couvrir l'intégralité de la relation. Des valeurs supérieures ou égales à zéro signifient une limite absolue, alors que des valeur négatives signifient max_pred_locks_per_transaction par la valeur absolue de ce paramètre. La valeur par défaut est -2, ce qui permet de conserver le comportement des anciennes version de PostgreSQL. Ce paramètre peut uniquement être modifié dans le fichier postgresql.conf ou indiqué sur la ligne de commande.

max_pred_locks_per_page (integer) #

Ceci contrôle combien de lignes sur une seule page peuvent être verrouillées avec prédicat avant que le verrou ne soit promu pour couvrir la page complète. La valeur par défaut est 2. Ce paramètre peut seulement être configuré dans le fichier postgresql.conf ou sur la ligne de commande du serveur.