The world's most popular open source database
En el bloqueo a nivel de fila, InnoDB utiliza un
algoritmo llamado bloqueo de próxima clave.
InnoDB lleva a cabo el bloqueo a nivel de fila de tal
manera que cuando busca o recorre el índice de una tabla, establece
bloqueos compartidos o exclusivos en los registros de índice que
encuentra. Por lo tanto, los bloqueos a nivel de fila son en realidad
bloqueos sobre registros del índice.
El conjunto de bloqueos de InnoDB sobre los registros
del índice también afecta al “gap” (posición vacía) que
precede al registro de índice. Si un usuario tiene un bloqueo compartido
o exclusivo sobre un registro R en un índice, otro
usuario no puede insertar un nuevo registro inmediatamente antes de
R en el orden del índice. Este bloqueo de posiciones
vacías se hace para evitar el llamado “problema fantasma”.
Suponiendo que se desean leer y bloquear todos los hijos de la tabla
hijos que tengan un identificador mayor a 100, con el
posterior intento de actualizar algunas columnas en las filas
seleccionadas:
SELECT * FROM child WHERE id > 100 FOR UPDATE;
Suponiendo que hay un índice sobre la columna id, la
consulta recorre ese índice comenzando por el primer registro donde
id es mayor a 100. Si el bloqueo establecido sobre el
índice no bloqueara también las inserciones hechas en las posiciones
vacías, durante el proceso se podría insertar una nueva fila en la
tabla. Si se ejecuta la misma sentencia SELECT dentro
de la misma transacción, se podría ver una nueva fila en el conjunto de
resultados devuelto por la consulta. Esto es contrario al principio de
aislamiento de las transacciones: una transacción deberia ejecutarse de
forma que los datos que ha leido no cambien en el transcurso de la
misma. Si se considera un conjunto de columnas como datos, el nuevo
registro hijo “fantasma” violaría el principio de
aislamiento.
Cuando InnoDB recorre un índice, también puede
bloquear la posición vacía después del último registro del índice. Es
precisamente lo que ocurre en el ejemplo anterior: Los bloqueos
impuestos por InnoDB evitan cualquier inserción en la
tabla donde id fuera mayor de 100.
Se puede emplear bloqueo de próxima clave para efectuar el control de la unicidad en una aplicación: Si se leen los datos en modo compartido y no se ve un duplicado de la fila que se va a insertar, entonces puede hacerse con la seguridad de que el bloqueo de próxima clave establecido sobre el registro que continúa a la fila insertada evita que cualquiera inserte un duplicado de ésta. Por lo tanto, el bloqueo de próxima clave permite “bloquear” la no existencia de algo en la tabla.
É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.

