Repaso
English

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

  1. Aumentar los timeouts de los locks para esperar más
  2. Tomar los locks en el mismo orden en todas partes y mantener cortas las transacciones (Opción correcta)
  3. Desactivar las transacciones de la aplicación en estas operaciones
  4. 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.

Términos clave

Practica esta pregunta en Repaso