English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutoriales básicos de PostgreSQL

Tutoriales avanzados de PostgreSQL

Interfaz de PostgreSQL

Lock (bloqueo) de PostgreSQL

Los bloqueos se utilizan principalmente para mantener la consistencia de los datos de la base de datos, pueden evitar que los usuarios modifique una fila o toda la tabla, generalmente se utilizan en bases de datos con alta concurrencia.

Cuando varios usuarios acceden a la base de datos al mismo tiempo, si no se controlan las operaciones concurrentes, puede leer y almacenar datos incorrectos, lo que destruye la consistencia de la base de datos.

En la base de datos hay dos tipos básicos de bloqueos: bloqueos exclusivos (Exclusive Locks) y bloqueos compartidos (Share Locks).

Si se agrega un bloqueo exclusivo al objeto de datos, otras transacciones no pueden leer ni modificarlo.

Si se agrega un bloqueo compartido, el objeto de base de datos se puede leer por otras transacciones, pero no se puede modificar.

Gramática del comando LOCK

La gramática básica del comando LOCK es la siguiente:

LOCK [ TABLE ]
name
 IN
lock_mode
  • name: El nombre de la tabla existente que se desea bloquear (opcionalmente con restricción de modo). Si solo se especifica antes del nombre de la tabla, solo se bloquea esa tabla. Si no se especifica, se bloquea esa tabla y todas sus subtablas (si las hay).

  • lock_mode: El modo de bloqueo especifica con qué tipo de bloqueo conflictivo se relaciona este bloqueo. Si no se especifica el modo de bloqueo, se utiliza el modo de acceso exclusivo con restricciones máximas. 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, se mantendrá el bloqueo durante el resto de la transacción actual. No hay comando de desbloqueo de tabla; los bloqueos siempre se liberan al final de la transacción.

Bloqueo

Puede ocurrir un bloqueo cuando dos transacciones esperan que la otra transacción complete su operación. Aunque PostgreSQL puede detectarlos y finalizarlos con un rollback, los bloqueos son muy incómodos. Para evitar que la aplicación se encuentre con este problema, asegúrese de diseñar la aplicación para bloquear objetos en el mismo orden.

Bloqueo de consulta

PostgreSQL proporciona métodos para crear bloqueos con significado definido por la aplicación. Estos se denominan bloqueos de consulta. Ya que el sistema no los obliga a usar, su uso correcto depende de la aplicación. Los bloqueos de consulta son muy útiles para estrategias de bloqueo que no son adecuadas para el modelo MVCC.

Por ejemplo, un uso común de la consulta de bloqueo es simular la estrategia de bloqueo pesimista típica en sistemas de gestión de datos de "archivo plano". Aunque las marcas almacenadas en la tabla pueden servir para el mismo propósito, el bloqueo de consulta es más rápido, evita la expansión de la tabla y se limpia automáticamente por el servidor al final de la sesión.

Ejemplo en línea

Crear tabla COMPANY (Descargar archivo SQL de COMPANY ),los datos son los siguientes:

w3codeboxdb# 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 mostrará w3La tabla COMPANY en la base de datos codeboxdb está bloqueada en modo ACCESS EXCLUSIVE.

La sentencia LOCK solo funciona en modo de transacción.

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

La operación superior obtendrá el siguiente resultado:

LOCK TABLE

El mensaje superior indica que la tabla está bloqueada hasta que finalice la transacción, y para completar la transacción, debe deshacer o comprometer la transacción.