sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo simular interbloqueo en PostgreSQL?

  1. Abrir dos conexiones en paralelo, como dos instancias de psql o dos ventanas de consulta en pgAdmin (cada una tiene su propia sesión).
  2. Inicie una transacción en cada conexión. BEGIN;
  3. Ejecuta por turnos comandos que entren en conflicto.
  4. Antes de que pueda confirmar, uno de los dos se revertirá con una excepción de interbloqueo.
  5. Es posible que desee revertir el otro. ROLLBACK;

Explícitamente bloqueo de tablas es tan simple como:

LOCK tbl;

El bloqueo de filas se puede hacer con:

SELECT * FROM tbl WHERE boo = 3 FOR UPDATE;

O FOR SHARE etc. Detalles en el manual.
(O implícitamente con UPDATE o DELETE .)

Ejemplo

Su ejemplo agregado no puede bloquearse. Ambos intentan primero tomar el mismo candado en la misma fila de la misma tabla. El segundo esperará a que termine el primero.

Ejemplo para producir realmente un interbloqueo (las filas deben existir o no se tomará ningún bloqueo):

Transaction 1                    Transaction 2
BEGIN;
                                 BEGIN;
SELECT salary1 
FROM   deadlock_demonstration
WHERE  worker_id = 1
FOR    UPDATE;
                                 SELECT salary1 
                                 FROM   deadlock_demonstration
                                 WHERE  worker_id = 2
                                 FOR    UPDATE;
UPDATE deadlock_demonstration
SET    salary1 = 100
WHERE  worker_id = 2;

                                 UPDATE deadlock_demonstration
                                 SET    salary1 = 100
                                 WHERE  worker_id = 1;

                    --> ... 💣 deadlock!

Resultado

El usuario OP3388473 contribuyó con esta captura de pantalla después de verificar la solución: