Il livello di isolamento predefinito per le tabelle InnoDB è in lettura ripetibile. Quando questo livello di isolamento è attivo, otteniamo il seguente comportamento (citazione da:https://dev.mysql.com/doc/refman/5.5/en/set-transaction.html ):
In altre parole:potresti provare a usare la chiave primaria nella condizione WHERE di SELECT? Quindi per esempio invece di:
START TRANSACTION;
SELECT * FROM productMacAddress WHERE status='free' limit 8 FOR UPDATE;
Prova:
START TRANSACTION;
SELECT * FROM productMacAddress WHERE id=10 FOR UPDATE;
nel caso in cui id sia la chiave primaria. Funzionerebbe anche qualsiasi altra colonna con un indice univoco. Quando si utilizzano colonne non univoche nella clausola WHERE, InnoDB bloccherà un intervallo di righe.