O nível de isolamento padrão para tabelas InnoDB é leitura repetível. Quando este nível de isolamento está ativo, obtemos o seguinte comportamento (citação de:https://dev.mysql.com/doc/refman/5.5/en/set-transaction.html ):
Em outras palavras:você poderia tentar usar a chave primária na condição WHERE do SELECT? Então, por exemplo, em vez de:
START TRANSACTION;
SELECT * FROM productMacAddress WHERE status='free' limit 8 FOR UPDATE;
Tentar:
START TRANSACTION;
SELECT * FROM productMacAddress WHERE id=10 FOR UPDATE;
caso id seja a chave primária. Qualquer outra coluna com um índice exclusivo também funcionaria. Ao usar colunas não exclusivas em sua cláusula WHERE, o InnoDB bloqueará um intervalo de linhas.