- Abrir dos conexiones en paralelo, como dos instancias de
psql
o dos ventanas de consulta en pgAdmin (cada una tiene su propia sesión). - Inicie una transacción en cada conexión.
BEGIN;
- Ejecuta por turnos comandos que entren en conflicto.
- Antes de que pueda confirmar, uno de los dos se revertirá con una excepción de interbloqueo.
- 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: