InnoDBテーブルのデフォルトの分離レベルは、反復可能な読み取りです。この分離レベルがアクティブな場合、次の動作が発生します(引用元: https://dev.mysql.com/doc/refman/5.5/en/set-transaction.html ):
言い換えると、SELECTのWHERE条件で主キーを使用してみてください。たとえば、次の代わりに:
START TRANSACTION;
SELECT * FROM productMacAddress WHERE status='free' limit 8 FOR UPDATE;
試してみてください:
START TRANSACTION;
SELECT * FROM productMacAddress WHERE id=10 FOR UPDATE;
idが主キーの場合。一意のインデックスを持つ他の列も機能します。 WHERE句で一意でない列を使用すると、InnoDBは行の範囲をロックします。