Z čistě teoretického hlediska to vypadá, že nezamykáte správné řádky (jiná podmínka v prvním příkazu než v příkazu update; kromě toho zamykáte pouze jeden řádek kvůli LIMIT 1
, zatímco později možná aktualizujete více řádků).
Zkuste toto:
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;
[upravit]
Pokud jde o důvod vašeho uváznutí, toto je pravděpodobná odpověď (z manuálu ):
Bez indexu SELECT ... FOR UPDATE
příkaz pravděpodobně uzamkne celou tabulku, zatímco u indexu uzamkne pouze některé řádky. Protože jste nezamkli správné řádky v prvním příkazu, během druhého příkazu se získá další zámek.
Je zřejmé, že k uváznutí nemůže dojít, pokud je celá tabulka uzamčena (tj. bez indexu). K zablokování jistě může dojít při druhém nastavení.