PostgreSQL - CERRADURAS

Cerraduras o exclusivo cerraduras o bloqueos de escritura impiden toda posibilidad de modificar una fila o una tabla entera. Las filas modificadas por UPDATE y DELETE se bloquean exclusivamente de forma automática durante la duración de la transacción. Esto evita que otros usuarios cambien la fila hasta que la transacción se confirme o se deshaga.

El único momento en que los usuarios deben esperar a otros usuarios es cuando intentan modificar la misma fila. Si modifican diferentes filas, no es necesario esperar. Las consultas SELECT nunca tienen que esperar.

La base de datos realiza el bloqueo automáticamente. En algunos casos, sin embargo, el bloqueo debe controlarse manualmente. El bloqueo manual se puede realizar mediante el comando LOCK. Permite especificar el alcance y el tipo de bloqueo de una transacción.

Sintaxis del comando LOCK

La sintaxis básica del comando LOCK es la siguiente:

LOCK [ TABLE ]
name
 IN
lock_mode
  • name- El nombre (opcionalmente calificado por esquema) de una tabla existente para bloquear. Si se especifica SOLO antes del nombre de la tabla, solo esa tabla está bloqueada. Si no se especifica ONLY, la tabla y todas sus tablas descendientes (si las hay) se bloquean.

  • lock_mode- El modo de bloqueo especifica con qué bloqueos entra en conflicto este bloqueo. Si no se especifica ningún modo de bloqueo, se utiliza ACCESS EXCLUSIVE, el modo más restrictivo. Los valores posibles son: ACCESO COMPARTIDO, FILA COMPARTIDA, FILA EXCLUSIVA, COMPARTIR ACTUALIZACIÓN EXCLUSIVA, COMPARTIR, COMPARTIR FILA EXCLUSIVA, EXCLUSIVA, ACCESO EXCLUSIVO.

Una vez obtenido, el bloqueo se mantiene durante el resto de la transacción actual. No hay ningún comando UNLOCK TABLE; los bloqueos siempre se liberan al final de la transacción.

DeadLocks

Los interbloqueos pueden ocurrir cuando dos transacciones están esperando que la otra finalice sus operaciones. Si bien PostgreSQL puede detectarlos y finalizarlos con un ROLLBACK, los puntos muertos aún pueden ser inconvenientes. Para evitar que sus aplicaciones se encuentren con este problema, asegúrese de diseñarlas de tal manera que bloqueen los objetos en el mismo orden.

Cerraduras de aviso

PostgreSQL proporciona medios para crear bloqueos que tienen significados definidos por la aplicación. Estos se denominan bloqueos de aviso . Como el sistema no hace cumplir su uso, corresponde a la aplicación utilizarlos correctamente. Los bloqueos de aviso pueden resultar útiles para las estrategias de bloqueo que no encajan con el modelo MVCC.

Por ejemplo, un uso común de los bloqueos de aviso es emular las estrategias de bloqueo pesimistas típicas de los sistemas de gestión de datos denominados "archivos planos". Si bien una bandera almacenada en una tabla podría usarse para el mismo propósito, los bloqueos de aviso son más rápidos, evitan la hinchazón de la tabla y el servidor los limpia automáticamente al final de la sesión.

Ejemplo

Considere la tabla EMPRESA que tiene registros de la siguiente manera:

testdb# select * from COMPANY;
 id | name  | age | address   | salary
----+-------+-----+-----------+--------
  1 | Paul  |  32 | California|  20000
  2 | Allen |  25 | Texas     |  15000
  3 | Teddy |  23 | Norway    |  20000
  4 | Mark  |  25 | Rich-Mond |  65000
  5 | David |  27 | Texas     |  85000
  6 | Kim   |  22 | South-Hall|  45000
  7 | James |  24 | Houston   |  10000
(7 rows)

El siguiente ejemplo bloquea la tabla EMPRESA dentro de la base de datos testdb en modo ACCESO EXCLUSIVO. La instrucción LOCK funciona solo en un modo de transacción:

testdb=#BEGIN;
LOCK TABLE company1 IN ACCESS EXCLUSIVE MODE;

La declaración de PostgreSQL dada anteriormente producirá el siguiente resultado:

LOCK TABLE

El mensaje anterior indica que la tabla está bloqueada hasta que finalice la transacción y para finalizar la transacción tendrá que revertir o confirmar la transacción.