От чисто теоретична гледна точка, изглежда, че не заключвате правилните редове (различно условие в първия израз, отколкото в изявлението за актуализиране; освен това заключвате само един ред поради LIMIT 1
, докато е възможно да актуализирате още редове по-късно).
Опитайте това:
START TRANSACTION;
SELECT v_id FROM v_ext WHERE username IS NULL AND v_id=yyy FOR UPDATE;
UPDATE v_ext SET username=xxx WHERE v_id=yyy;
COMMIT;
[редактиране]
Що се отнася до причината за вашата задънена улица, това е вероятният отговор (от ръководството ):
Без индекс, SELECT ... FOR UPDATE
операторът вероятно ще заключи цялата таблица, докато с индекс той заключва само някои редове. Тъй като не сте заключили правилните редове в първия израз, по време на втория израз се придобива допълнително заключване.
Очевидно блокиране не може да се случи, ако цялата таблица е заключена (т.е. без индекс). Със сигурност може да възникне застой при втората настройка.