La commande LOCK TABLE permet de verrouiller une table dans la base de données actuelle. Le mode de verrouillage spécifie le type de verrou à acquérir.
La commande LOCK TABLE aboutit lorsqu'un verrou du mode spécifié peut être acquis sur la table. La commande attend aussi longtemps que nécessaire pour obtenir le verrou, à moins que vous ne spécifiez l'option NOWAIT, qui annule la transaction si la commande ne parvient pas à acquérir le verrou immédiatement.
Un verrou est conservé jusqu'à ce que la transaction soit validée ou abandonnée. Si la commande LOCK TABLE est exécutée de manière implicite (à savoir, en dehors d'une paire BEGIN/COMMIT), elle acquiert le verrou lorsqu'elle y est autorisée, puis le libère immédiatement, car il s'agit d'une transaction à une instruction qui est validée implicitement une fois terminée.
Si possible, les commandes LOCK TABLE doivent être exécutées avant les éventuelles requêtes dans la transaction. L'acquisition d'un verrou après avoir exécuté une requête sur des tables utilisateur ne protège pas nécessairement une transaction des erreurs de sérialisation.
Si vous prévoyez d'exécuter des commandes LOCK TABLE sur plusieurs tables à l'intérieur d'une transaction, exécutez-les suivant un ordre défini par l'application. Cela minimise le risque d'interblocage. En cas d'interblocage, Postgres annule l'une des transactions impliquées dans l'interblocage.
Le tableau ci-après illustre la matrice des conflits de verrouillage, à savoir, quels verrous peuvent bloquer d'autres types de verrou. Un mode de verrouillage est en conflit avec un autre mode si un verrou ne peut pas être octroyé à une transaction lorsqu'une autre transaction détient le verrou opposé sur la même table. Les verrous détenus par la même transaction n'entrent pas en conflit entre eux ; une transaction peut détenir des verrous de plusieurs modes sur la même table. Si plusieurs verrous doivent être acquis sur la même table, demandez les verrous les plus forts en premier pour minimiser le risque d'interblocage. Si une transaction a besoin de deux verrous sur la même table, aucun d'eux n'étant plus fort que l'autre (en particulier, SHARE et ROW EXCLUSIVE), envisagez un mode de verrouillage qui subsume les deux, tel que SHARE ROW EXCLUSIVE.
| Partage d'accès | Partage de ligne | Exclusive à la ligne | Partage | Exclusif au partage de ligne | Exclusif | Accès exclusif | |
|---|---|---|---|---|---|---|---|
| Partage d'accès | OK | OK | OK | OK | OK | OK | Conflit |
| Partage de ligne | OK | OK | OK | OK | OK | Conflit | Conflit |
| Exclusive à la ligne | OK | OK | OK | Conflit | Conflit | Conflit | Conflit |
| Partage | OK | OK | Conflit | OK | Conflit | Conflit | Conflit |
| Exclusif au partage de ligne | OK | OK | Conflit | Conflit | Conflit | Conflit | Conflit |
| Exclusif | OK | Conflit | Conflit | Conflit | Conflit | Conflit | Conflit |
| Accès exclusif | Conflit | Conflit | Conflit | Conflit | Conflit | Conflit | Conflit |
LOCK TABLE <table> in <mode_verrouillage> MODE [NOWAIT]
La commande LOCK TABLE accepte les entrées suivantes :
| Entrée | Description |
|---|---|
| <table> | Nom de la table à verrouiller. |
| <mode_verrouillage> | Type de verrou à acquérir sur la table (voir Tableau 3). Le mot ROW dans un mode de verrouillage n'implique pas de verrou au niveau ligne. |
| NOWAIT | La commande doit renvoyer une erreur et abandonner la transaction si elle ne parvient pas à acquérir immédiatement le verrou demandé. |
| Mode de verrouillage | Acquis par | Droits requis | Important |
|---|---|---|---|
| ACCESS SHARE | SELECT | Select | Mode de vrrouillage le plus faible. Plusieurs transactions peuvent maintenir ce type de verrou sur une table. |
| ROW SHARE | Insert, Delete ou Update | Plusieurs transactions peuvent maintenir ce type de verrou sur une table. | |
| ROW EXCLUSIVE | INSERT, DELETE et UPDATE | Insert, Delete ou Update | Plusieurs transactions peuvent maintenir ce type de verrou sur une table. |
| SHARE | CREATE MATERIALIZED VIEW et GENERATE STATISTICS | Select ou Genstats | Plusieurs transactions peuvent maintenir ce type de verrou sur une table. |
| SHARE ROW EXCLUSIVE | Insert, Delete ou Update | ||
| EXCLUSIVE | Insert, Delete ou Update | ||
| ACCESS EXCLUSIVE | DROP TABLE, ALTER TABLE et TRUNCATE TABLE | Drop, Alter ou Truncate |
La commande LOCK TABLE génère la sortie suivante :
| Sortie | Description |
|---|---|
| LOCK TABLE | La commande a abouti. |
| NOTICE: LOCK TABLE issued after query against user tables | Si une commande LOCK TABLE est exécutée une fois que la transaction a exécuté une requête sur des tables utilisateur, le système affiche un message NOTICE et la commande aboutit lorsqu'elle peut acquérir le verrou demandé. |
Vous devez être administrateur, propriétaire de la table, propriétaire de la base de données ou du schéma dans lequel la table est définie ou votre compte doit disposer des droits d'objet approprié, comme décrit dans Tableau 3.
LOCK TABLE customers IN ROW EXCLUSIVE MODE;