Deadlocks
Cuando dos transacciones acceden a los mismos recursos pero en distinto orden, cada una puede quedar esperando que la otra libere algo que necesita. Ninguna avanza. Eso es un deadlock.
Las cuatro condiciones que lo hacen posible
Un deadlock se produce cuando se cumplen simultáneamente las cuatro condiciones siguientes:
| Condición | Descripción |
|---|---|
| Exclusión mutua | Un recurso solo puede ser accedido por una transacción a la vez |
| Espera con tenencia | Una transacción mantiene un lock y espera para adquirir otro |
| Sin preempción | Un lock no puede ser arrebatado forzosamente a una transacción |
| Espera circular | T1 espera a T2, T2 espera a T1 (o una cadena más larga de dependencias) |
Si alguna de estas condiciones no se cumple, el deadlock no puede ocurrir.
Cómo se forma la espera circular
Ninguna de las dos transacciones puede avanzar. Ambas esperan infinitamente. La cadena de dependencias forma un ciclo y la base de datos concluye que hay un deadlock.
Cómo se manejan los deadlocks
Un deadlock no puede mantenerse indefinidamente, ya que impediría que las transacciones involucradas continuaran ejecutándose. Por ello, los gestores de bases de datos incorporan mecanismos internos para evitar que el ciclo llegue a formarse o detectarlo una vez que ocurre y restaurar el progreso del sistema.
Aunque los gestores manejan los deadlocks internamente, un buen diseño de las transacciones ayuda a reducir la probabilidad de que ocurran.
Qué no es un deadlock
- No es un error del sistema. Es una consecuencia natural del uso de locks en concurrencia.
- No corrompe datos. La base de datos revierte una transacción de forma controlada.
- No ocurre solo entre dos transacciones. Puede involucrar cualquier cantidad de transacciones que formen un ciclo de espera.
- No es exclusivo de las bases de datos. Cualquier sistema que use locks puede presentar deadlocks.