PostgreSQL LOCK (Verrou)
Les verrous sont principalement utilisés pour maintenir la cohérence des données de la base de données. Ils peuvent empêcher les utilisateurs de modifier une ligne ou la table entière, et sont généralement utilisés dans les bases de données à forte concurrence.
Lorsque plusieurs utilisateurs accèdent à la base de données, si les opérations concurrentes ne sont pas contrôlées, des données incorrectes peuvent être lues et stockées, détruisant ainsi la cohérence de la base de données.
Il existe deux types de base de verrous dans une base de données : les verrous exclusifs et les verrous partagés.Si un verrou exclusif est ajouté à un objet de données, les autres transactions ne peuvent ni le lire ni le modifier.
Si un verrou partagé est ajouté, l'objet de base de données peut être lu par d'autres transactions, mais ne peut pas être modifié.
Syntaxe de la commande LOCK
La syntaxe de base de la commande LOCK est la suivante :
LOCK [ TABLE ] name IN lock_mode
- name : Le nom (éventuellement qualifié par un schéma) d'une table existante à verrouiller. Si ONLY est spécifié avant le nom de la table, seule cette table est verrouillée. Si ONLY n'est pas spécifié, la table et toutes ses tables enfants (le cas échéant) sont verrouillées.
- lock_mode : Le mode de verrouillage spécifie avec quels verrous ce verrou entre en conflit. Si aucun mode de verrouillage n'est spécifié, le mode le plus restrictif, ACCESS EXCLUSIVE, est utilisé. Les valeurs possibles sont : ACCESS SHARE, ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE.
Une fois un verrou obtenu, il est détenu pour le reste de la transaction en cours. Il n'existe pas de commande UNLOCK TABLE ; les verrous sont toujours libérés à la fin de la transaction.
Interblocage
Un interblocage peut se produire lorsque deux transactions s'attendent mutuellement pour terminer leurs opérations. Bien que PostgreSQL puisse les détecter et y mettre fin par un rollback, les interblocages restent très gênants. Pour éviter que votre application ne rencontre ce problème, assurez-vous que l'application est conçue pour verrouiller les objets dans le même ordre.
Verrous consultatifs
PostgreSQL fournit des méthodes pour créer des verrous ayant des significations définies par l'application. Ceux-ci sont appelés verrous consultatifs. Étant donné que le système n'impose pas leur utilisation, l'utilisation correcte incombe à l'application. Les verrous consultatifs sont utiles pour les stratégies de verrouillage qui ne correspondent pas au modèle MVCC.
Par exemple, un usage courant des verrous consultatifs consiste à simuler la stratégie de verrouillage pessimiste typique des systèmes de gestion de données dits « flat-file ». Bien que des drapeaux stockés dans une table puissent être utilisés dans le même but, les verrous consultatifs sont plus rapides, évitent le gonflement des tables et sont automatiquement nettoyés par le serveur à la fin d'une session.
Exemples
Créez la table COMPANY (Téléchargez le fichier SQL COMPANY), avec les données suivantes :
exampledb# select * from COMPANY; id | name | age | address | salary ----+-------+-----+-----------+-------- 1 | Paul | 32 | California| 20000 2 | Allen | 25 | Texas | 15000 3 | Teddy | 23 | Norway | 20000 4 | Mark | 25 | Rich-Mond | 65000 5 | David | 27 | Texas | 85000 6 | Kim | 22 | South-Hall| 45000 7 | James | 24 | Houston | 10000 (7 rows)
L'exemple suivant verrouille la table COMPANY dans la base de données exampledb en mode ACCESS EXCLUSIVE.
L'instruction LOCK ne fonctionne qu'en mode transaction.
exampledb=#BEGIN; LOCK TABLE company1 IN ACCESS EXCLUSIVE MODE;
L'opération ci-dessus donnera le résultat suivant :
LOCK TABLE
Le message ci-dessus indique que la table est verrouillée jusqu'à la fin de la transaction, et pour terminer la transaction, vous devez effectuer un rollback ou un commit de la transaction.
Autres extensions