PostgreSQL | ||
---|---|---|
Anterior | Capítulo 10. Multi-Version Concurrency Control (Control de la Concurrencia Multi Versión) | Siguiente |
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.
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.
Adquirido por SELECT FOR UPDATE y LOCK TABLE para declaraciones IN ROW SHARE MODE.
Entra en conflictos con los modos ExclusiveLock y AccessExclusiveLock.
Lo adquieren UPDATE, DELETE, INSERT y LOCK TABLE para declaraciones IN ROW EXCLUSIVE MODE.
Choca con los modos ShareLock, ShareRowExclusiveLock, ExclusiveLock y AccessExclusiveLock.
Lo adquieren CREATE INDEX y LOCK TABLE para declaraciones IN SHARE MODE.
Está en conflicto con los modos RowExclusiveLock, ShareRowExclusiveLock, ExclusiveLock y AccessExclusiveLock.
Lo toma LOCK TABLE para declaraciones IN SHARE ROW EXCLUSIVE MODE.
Está en conflicto con los modos RowExclusiveLock, ShareLock, ShareRowExclusiveLock, ExclusiveLock y AccessExclusiveLock.
Lo toma LOCK TABLE para declaraciones IN EXCLUSIVE MODE.
Entra en conflicto con los modos RowShareLock, RowExclusiveLock, ShareLock, ShareRowExclusiveLock, ExclusiveLock y 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).
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.