El nivel de aislamiento predeterminado para las tablas de InnoDB es lectura repetible. Cuando este nivel de aislamiento está activo, obtenemos el siguiente comportamiento (cita de:https://dev.mysql.com/doc/refman/5.5/en/set-transaction.html ):
En otras palabras:¿podría intentar usar la clave principal en la condición WHERE de SELECT? Entonces, por ejemplo, en lugar de:
START TRANSACTION;
SELECT * FROM productMacAddress WHERE status='free' limit 8 FOR UPDATE;
Prueba:
START TRANSACTION;
SELECT * FROM productMacAddress WHERE id=10 FOR UPDATE;
en caso de que id sea la clave principal. Cualquier otra columna con un índice único también funcionaría. Cuando use columnas no únicas en su cláusula WHERE, InnoDB bloqueará un rango de filas.