InnoDB
detecta automáticamente un deadlock
de transacciones y cancela una o más transacciones para
evitarlo. InnoDB
intenta escoger para
cancelar transacciones pequeñas, el tamaño de la transacción
es determinado por el número de filas insertadas, actualizadas,
o eliminadas.
InnoDB
se mantiene al tanto de los bloqueos
de tablas si innodb_table_locks=1
(1 es el
valor predeterminado), y la capa MySQL por debajo sabe acerca de
bloqueos a nivel de fila. En otro caso,
InnoDB
no puede detectar deadlocks cuando
están involucrados un bloqueo de tabla establecido por una
sentencia LOCK TABLES
o por otro motor de
almacenamiento que no sea InnoDB
. Estas
situaciones se deben resolver estableciendo el valor de la
variable de sistema innodb_lock_wait_timeout
.
Cuando InnoDB
lleva a cabo una cancelación
completa de una transacción, todos los bloqueos de la
transacción son liberados. Sin embargo, si solamente se cancela
como resultado de un error una sentencia SQL individual, algunos
de los bloqueos impuestos por la sentencia SQL podrían
mantenerse. Esto se debe a que InnoDB
guarda
los bloqueos de fila en un formato en el que no puede luego
saber qué sentencia SQL originó cada bloqueo.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.