Bloqueos y tablas

Postgres ofrece varios modos de bloqueo para controlar el acceso concurrente a los datos en tablas. Algunos de estos modos de bloqueo los adquiere Postgres automáticamente antes de la ejecución de una declaración, mientras que otros son proporcionados para ser usados por las aplicaciones. Todos los modos de bloqueo (excepto para AccessShareLock) adquiridos en un transacción se mantienen hasta la duración de la transacción.

Además de bloqueos, también se usa compartición en exclusiva para controlar acessos de lectura/escritura a las páginas de tablas en un buffer compartido. Este método se pone en marcha inmediatamente después de que un tuplo es traído o actualizado.

Bloqueos a nivel de tabla

AccessShareLock

Un modo de bloqueo adquirido automáticamente sobre tablas que están siendo consultadas. Postgres libera estos bloqueos después de que se haya ejecutado una declaración.

Conflictos con AccessExclusiveLock.

RowShareLock

Adquirido por SELECT FOR UPDATE y LOCK TABLE para declaraciones IN ROW SHARE MODE.

Entra en conflictos con los modos ExclusiveLock y AccessExclusiveLock.

RowExclusiveLock

Lo adquieren UPDATE, DELETE, INSERT y LOCK TABLE para declaraciones IN ROW EXCLUSIVE MODE.

Choca con los modos ShareLock, ShareRowExclusiveLock, ExclusiveLock y AccessExclusiveLock.

ShareLock

Lo adquieren CREATE INDEX y LOCK TABLE para declaraciones IN SHARE MODE.

Está en conflicto con los modos RowExclusiveLock, ShareRowExclusiveLock, ExclusiveLock y AccessExclusiveLock.

ShareRowExclusiveLock

Lo toma LOCK TABLE para declaraciones IN SHARE ROW EXCLUSIVE MODE.

Está en conflicto con los modos RowExclusiveLock, ShareLock, ShareRowExclusiveLock, ExclusiveLock y AccessExclusiveLock.

ExclusiveLock

Lo toma LOCK TABLE para declaraciones IN EXCLUSIVE MODE.

Entra en conflicto con los modos RowShareLock, RowExclusiveLock, ShareLock, ShareRowExclusiveLock, ExclusiveLock y AccessExclusiveLock.

AccessExclusiveLock

Lo toman ALTER TABLE, DROP TABLE, VACUUM y LOCK TABLE.

Choca con RowShareLock, RowExclusiveLock, ShareLock, ShareRowExclusiveLock, ExclusiveLock y AccessExclusiveLock.

Nota

Sólo AccessExclusiveLock bloquea la declaración SELECT (sin FOR UPDATE).

Bloqueos a nivel de fila

Este tipo de bloqueos se producen cuando campos internos de una fila son actualizados (o borrados o marcados para ser actualizados). Postgres no retiene en memoria ninguna información sobre filas modificadas y de este modo no tiene límites para el número de filas bloqueadas sin incremento de bloqueo.

Sin embargo, tenga en cuenta que SELECT FOR UPDATE modificará las filas seleccionadas marcándolas, de tal modo que se escribirán en el disco.

Los bloqueos a nivel de fila no afecta a los datos consultados. Estos son usados para bloquear escrituras a la misma fila únicamente.