Dos transacciones bloquean las filas A y luego B, y B y luego A, y caen en deadlock. ¿Cuál es la mejor prevención?
Opciones
- Aumentar los timeouts de los locks para esperar más
- Tomar los locks en el mismo orden en todas partes y mantener cortas las transacciones (Opción correcta)
- Desactivar las transacciones de la aplicación en estas operaciones
- Usar SELECT * para que se bloqueen todas las columnas de las filas
Respuesta
Adquirir los locks en un orden coherente en todas partes y mantener cortas las transacciones
Por qué
Deadlock: la transacción 1 tiene A y espera B, mientras la transacción 2 tiene B y espera A. Ambas esperan para siempre, así que la base de datos mata a una.
Si todo el código bloquea las filas siempre en el mismo orden (por ejemplo el ID más bajo primero), este círculo no puede formarse.
Las transacciones cortas retienen los locks menos tiempo. Además, reintenta cuando la base de datos informe de un deadlock.
Recuerda
Mismo orden de locks en todas partes → sin deadlocks.