PostgreSQL LOCK (bloqueos)
Los bloqueos sirven principalmente para mantener la consistencia de los datos de la base de datos, pueden impedir que los usuarios modifiquen una fila o toda la tabla, y generalmente se usan en bases de datos con alta concurrencia.
Cuando varios usuarios acceden a la base de datos, si no se controlan las operaciones concurrentes, se podrían leer y almacenar datos incorrectos, comprometiendo la consistencia de la base de datos.
Hay dos tipos básicos de bloqueos en la base de datos: bloqueos exclusivos (Exclusive Locks) y bloqueos compartidos (Share Locks).Si un objeto de datos tiene un bloqueo exclusivo, otras transacciones no pueden leerlo ni modificarlo.
Si se aplica un bloqueo compartido, el objeto de la base de datos puede ser leído por otras transacciones, pero no puede ser modificado.
Sintaxis del comando LOCK
La sintaxis básica del comando LOCK es la siguiente:
LOCK [ TABLE ] name IN lock_mode
- name: el nombre de la tabla existente que se va a bloquear (con un modificador de esquema opcional). Si solo se especifica delante del nombre de la tabla, solo se bloquea esa tabla. Si no se especifica, se bloquea la tabla y todas sus subtablas (si las hay).
- lock_mode: el modo de bloqueo especifica con qué bloqueo entra en conflicto. Si no se especifica un modo de bloqueo, se utiliza el modo de acceso exclusivo con mayores restricciones. Los valores posibles son: ACCESS SHARE, ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE.
Una vez obtenido el bloqueo, este se mantiene durante el resto de la transacción actual. No hay un comando para desbloquear la tabla; el bloqueo siempre se libera al final de la transacción.
Interbloqueo
Un interbloqueo puede ocurrir cuando dos transacciones esperan mutuamente a que la otra complete sus operaciones. Aunque PostgreSQL puede detectarlos y terminarlos con un retroceso (rollback), los interbloqueos siguen siendo muy inconvenient. Para evitar que la aplicación enfrente este problema, asegúrese de diseñarla para que bloquee los objetos en el mismo orden.
Bloqueos de asesoramiento
PostgreSQL proporciona métodos para crear bloqueos con un significado definido por la aplicación. Estos se denominan bloqueos de asesoramiento. Como el sistema no obliga a usarlos, su uso correcto depende de la aplicación. Los bloqueos de asesoramiento son muy útiles para estrategias de bloqueo que no encajan bien en el modelo MVCC.
Por ejemplo, un uso común de los bloqueos de asesoramiento es simular la estrategia de bloqueo pesimista típica de los sistemas de gestión de datos de "archivos planos". Aunque se pueden usar banderas almacenadas en la tabla con el mismo propósito, los bloqueos de asesoramiento son más rápidos, evitan el aumento innecesario de la tabla y el servidor los limpia automáticamente al final de la sesión.
Ejemplo
Cree la tabla COMPANY (descargar el archivo SQL de COMPANY), los datos son los siguientes:
ejemplodb# 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 COMPANY en la base de datos ejemplodb con el modo ACCESS EXCLUSIVE.
La declaración LOCK solo funciona en modo transacción.
ejemplodb=#BEGIN; LOCK TABLE company1 IN ACCESS EXCLUSIVE MODE;
La operación anterior producirá el siguiente resultado:
LOCK TABLE
El mensaje anterior indica que la tabla está bloqueada hasta que finalice la transacción, y para completarla debe retroceder (rollback) o confirmar (commit) la transacción.
Otras extensiones