| Documentation PostgreSQL 7.2 | ||
|---|---|---|
| <<< Previous | Next >>> | |
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 |
nom d'une table existante à verrouiller.
![]() | 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.
![]() | Automatiquement acquis par SELECT ... FOR UPDATE. |
Conflits avec les modes de verrouillage EXCLUSIVE and ACCESS EXCLUSIVE.
![]() | Automatiquement acquis par les instructions UPDATE, DELETE, et INSERT. |
Conflits avec les modes SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE et ACCESS EXCLUSIVE.
![]() | 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.
![]() | 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.
![]() | 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.
![]() | 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.
![]() | 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. |
![]() | 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.
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 :
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).
Un verrou partagé permet aux autres d'être aussi du même type, mais mais empêche le verrouillage EXCLUSIVE correspondant.
Verrouille le schéma de table.
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.
![]() | 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:
Les transactions doivent acquérir des verous sur les mêmes objets dans le même ordre.
Par exemple, si une application met à jour la ligne R1 et met à jour la ligne R2 (dans la même transaction) alors la seconde application ne pourra pas mettre à jour R2 si R1 est mis à jour plus tard (dans une seule transaction). De même, la mise à jour des lignes R1 et R2 devra se faire dans le même ordre que la première application.
Les transactions acquerront deux modes de verrouillage conflictuels seulement si l'un d'eux est auto-conflictuel (i.e, peut être maintenu par une seule transaction à un moment). Si de multiples modes de verrouillage sont insérés, alors les transactions acquerront toujours le mode le plus restrictif en premier.
Un exemple de cette règle a été donné précédemment quand nous parlions de l'utilisation du mode SHARE ROW EXCLUSIVE de préférence au mode SHARE.
![]() | 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.
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.
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;
|
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).
| <<< Previous | Home | Next >>> |
| LOAD | Up | MOVE |