LOCK

Name

LOCK  --  verrouille une table.

Synopsis

LOCK [ TABLE ] name [, ...]
LOCK [ TABLE ] name [, ...] IN lockmode MODE

where lockmode is one of:

	ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE |
	SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE
  

Entrées

name

nom d'une table existante à verrouiller.

ACCESS SHARE MODE

Note

Ce mode de verrouillage est placé automatiquement sur les tables questionnées.

C'est le mode de verrouillage le moins restrictif qui entre en conflit seulement avec le mode ACCESS EXCLUSIVE. Son but est de protéger une table questionnée des commandes concurrentes ALTER TABLE, DROP TABLE et VACUUM FULL sur la même table.

ROW SHARE MODE

Note

Automatiquement acquis par SELECT ... FOR UPDATE.

Conflits avec les modes de verrouillage EXCLUSIVE and ACCESS EXCLUSIVE.

ROW EXCLUSIVE MODE

Note

Automatiquement acquis par les instructions UPDATE, DELETE, et INSERT.

Conflits avec les modes SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE et ACCESS EXCLUSIVE.

SHARE UPDATE EXCLUSIVE MODE

Note

Automatiquement acquis par VACUUM (sans FULL).

Conflits avec les modes SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE and ACCESS EXCLUSIVE. Ce mode protège une table contre les changements de schéma concurents et les VACUUM.

SHARE MODE

Note

Automatiquement acquis par CREATE INDEX. Verrous partagés sur la table entière.

Conflits avec les modes ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE ROW EXCLUSIVE, EXCLUSIVE et ACCESS EXCLUSIVE. Ce mode protège une table contre les mises à jour concurentes.

SHARE ROW EXCLUSIVE MODE

Note

Comme EXCLUSIVE MODE, mais permet le ROW SHARE verrouillé par les autres.

Conflits avec les modes ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE et ACCESS EXCLUSIVE.

EXCLUSIVE MODE

Note

Mode encore plus restrictif que SHARE ROW EXCLUSIVE. Il bloque toutes les requêtes concurentes ROW SHARE/SELECT...FOR UPDATE.

Conflits avec les modes ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE and ACCESS EXCLUSIVE. Ce mode admet seulement le ACCESS SHARE concurent, i.e., lit seulement depuis la table qui peut procéder en parallèle avec une transaction maintenant ce mode de verrouillage.

ACCESS EXCLUSIVE MODE

Note

Automatiquement acquis par les instructions ALTER TABLE, DROP TABLE, VACUUM FULL. C'est le mode de verrouillage le plus restrictif qui protège une table verrouillée d'opérations concurentes.

Note

Ce mode de verrouillage est aussi acquis par un LOCK TABLE non qualifié (i.e., la commande sans option de mode de verrouillage explicite).

Conflits avec tous les modes de verrouillage.

Sorties

LOCK TABLE

Le verrou est appliqué avec succès.

ERROR name: Table does not exist.

Message retourné si name n'existe pas.

Description

LOCK TABLE contrôle les accès concurents à une table pendant la durée d'une transaction. PostgreSQL utilise toujours le mode de verrouillage le moins restrictif quand c'est possible. LOCK TABLE est fournit pour les cas où vous avez besoin de verrous plus restrictifs.

Le verrouillage des SGBDR utilise la terminologie suivante :

EXCLUSIVE

Un verrou exclusif empêche les autres verrous de même type. (Notez : le mode ROW EXCLUSIVE ne suit pas cette convention de nommage parfaitement, car il est partagé au niveau de la table; c'est exclusif seulement avec le respect des lignes spécifiques qui sont mises à jour).

SHARE

Un verrou partagé permet aux autres d'être aussi du même type, mais mais empêche le verrouillage EXCLUSIVE correspondant.

ACCESS

Verrouille le schéma de table.

ROW

Verrouille les lignes individuelles.

Par exemple, supposons qu'une application lance une transaction au niveau d'isolation READ COMMITTED et ait besoin de s'assurer de l'existence de données dans une table pour la durée de la transaction. Pour ça vous pouvez obtenir le mode de verrouillage SHARE sur la table avant de la questionner. ceci empêchera les modifications de données concurentes et assurera les opérations de lecture ultérieures sur la table voyant les données dans leur état actuel, car le mode de verrouillage SHARE entre en conflit avec les modes de verrouillage ROW EXCLUSIVE acquis par les écritures, et vos instructions LOCK TABLE name IN SHARE MODE attendrons jusqu'à ce que des opérations d'écriture concurentes soient validées ou avortées. Ainsi, une fois obtenu le verrouillage, il n'y a pas d'écritures non-validées marquantes.

Note

Pour lire les données dans leur état actuel quand vous lancez une transaction au niveau d'isolation SERIALIZABLE, vous devez exécuter l'instruction LOCK TABLE avant l'exécution d'une instruction DML. Une vue de transaction sera gelée quand son instruction DML débute en premier.

En plus de ce qui précède, si une transaction modifie les données d'une table, le mode de verrouillage SHARE ROW EXCLUSIVE sera acquis pour pour éviter les conditions de verrous mortels quand deux transactions concurrentes tentent de verrouiller une table en mode SHARE et essaient de modifier les données dans cette table, les deux (implicitement) acquérant le mode de verrouillage ROW EXCLUSIVE qui provoque des conflits avec un verrou LOCK concurrent.

Pour continuer avec le verrou mortel (quand deux transactions attendent une autre), vous devez suivre deux règles générales pour éviter ces conditions:

Note

Postgres peut détecter les verrous mortels et avortera au moins une transaction en attente pour résoudre le verrou mortel.

Lors du verrouillage de plusieurs tables, la commande LOCK a, b; est équivalente à LOCK a; LOCK b;. Les tables sont verrouillées une par une dans l'ordre spécifié dans la commande LOCK.

Notes

LOCK ... IN ACCESS SHARE MODE necessite les droits SELECT sur la table cible. Toutes les autres formes de LOCK nécessitent les droits de UPDATE et/ou DELETE.

LOCK est utile seulement dans un bloc de transaction (BEGIN...COMMIT), car le bloc est supprimé aussitôt que la transaction prend fin. Une commande LOCK apparaissant à côté d'un bloc de transaction forme une transaction auto-contenue, ainsi le verrou sera supprimé aussitôt qu'il est obtenu.

Utilisation

Illustration d'un verrou SHARE sur une table à clé primaire en exécutant des insertions dans une table à clé étrangère :

BEGIN WORK;
LOCK TABLE films IN SHARE MODE;
SELECT id FROM films 
    WHERE name = 'Star Wars: Episode I - The Phantom Menace';
-- Do ROLLBACK if record was not returned
INSERT INTO films_user_comments VALUES 
    (_id_, 'GREAT! I was waiting for it for so long!');
COMMIT WORK;
   

Prend un verrou SHARE ROW EXCLUSIVE sur une table à clé primaire en exécutant une opération de suppression :

BEGIN WORK;
LOCK TABLE films IN SHARE ROW EXCLUSIVE MODE;
DELETE FROM films_user_comments WHERE id IN
    (SELECT id FROM films WHERE rating < 5);
DELETE FROM films WHERE rating < 5;
COMMIT WORK;
   

Compatibilité

SQL92

Il n'y a pas de LOCK TABLE en SQL92, qui utilise à la place SET TRANSACTION pour spécifier les niveaux de concurence sur les transactions. Nous supportons ça aussi; voir SET TRANSACTION pour les détails.

Sauf pour les modes de verrouillage ACCESS SHARE, ACCESS EXCLUSIVE, et SHARE UPDATE EXCLUSIVE, les modes de verrouillage de PostgreSQL et la syntaxe LOCK TABLE sont compatibles avec ceux présents dans Oracle(TM).