Verrouillage et Tables

Postgres fournit divers modes de verrouillage pour contrôler les accès concurrents aux données dans les tables. Certains de ces modes de verrouillage sont acquis par Postgres automatiquement avant l'exécution de la commande, tandis que d'autres sont fournis pour être utilisés par les applications. Tous les modes de verrouillage (sauf pour AccessShareLock) acquis dans une transaction fonctionnent pour la durée de la transaction.

En plus des verrouillages, des verrous partagés/exclusifs sont utilisés pour contrôler les accès en lecture/écriture aux pages des tables dans le tampon de requête partagée. Les verrous sont libérés immédiatement après qu'un tuple soit récupéré ou mis à jour.

Verrouillages niveau-table

AccessShareLock

Un mode de verrouillage interne acquit automatiquement sur les tables questionnées. Postgres libère ces verrous une fois la commande exécutée.

Conflits avec AccessExclusiveLock seulement.

RowShareLock

Acquit par SELECT FOR UPDATE et LOCK TABLE pour les clauses IN ROW SHARE MODE.

Conflits avec les modes ExclusiveLock et AccessExclusiveLock.

RowExclusiveLock

Acquit par UPDATE, DELETE, INSERT et LOCK TABLE pour les clauses IN ROW EXCLUSIVE MODE.

Conflits avec les modes ShareLock, ShareRowExclusiveLock, ExclusiveLock et AccessExclusiveLock.

ShareLock

Acquit par CREATE INDEX et LOCK TABLE pour les clauses IN SHARE MODE.

Conflits avec les modes RowExclusiveLock, ShareRowExclusiveLock, ExclusiveLock et AccessExclusiveLock.

ShareRowExclusiveLock

Acquit par LOCK TABLE pour les clauses IN SHARE ROW EXCLUSIVE MODE.

Conflits avec les modes RowExclusiveLock, ShareLock, ShareRowExclusiveLock, ExclusiveLock et AccessExclusiveLock.

ExclusiveLock

Acquit par LOCK TABLE pour les clauses IN EXCLUSIVE MODE.

Conflits avec les modes RowShareLock, RowExclusiveLock, ShareLock, ShareRowExclusiveLock, ExclusiveLock et AccessExclusiveLock.

AccessExclusiveLock

Acquit par les clauses ALTER TABLE, DROP TABLE, VACUUM et LOCK TABLE.

Conflits avec les modes RowShareLock, RowExclusiveLock, ShareLock, ShareRowExclusiveLock, ExclusiveLock et AccessExclusiveLock.

Note

Seul AccessExclusiveLock bloque la clause SELECT (sans l'option FOR UPDATE).

Verrouillages niveau-ligne

Ces verrous sont acquis quand les champs internes d'une ligne sont en cours de mise à jour (ou suppression ou marqués pour mise à jour). Postgres n'enregistre aucune information en mémoire sur les lignes modifiées et ainsi n'a pas de limite quant au nombre de lignes verrouillées.

Cependant il faut prendre en compte que SELECT FOR UPDATE modifiera les lignes sélectionnées pour les marquer et ainsi il en résultera des écritures disque.

Les verrous niveau-ligne n'affectent pas les données questionnées. Ils sont utilisés pour bloquer les écritures sur la même ligne seulement.