Puur theoretisch gezien lijkt het alsof je niet de juiste rijen vergrendelt (andere voorwaarde in de eerste instructie dan in de update-instructie; bovendien vergrendel je maar één rij vanwege LIMIT 1
, terwijl u mogelijk later meer rijen bijwerkt).
Probeer dit:
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;
[bewerken]
Wat betreft de reden voor je impasse, dit is het waarschijnlijke antwoord (uit de handleiding ):
Zonder index, de SELECT ... FOR UPDATE
statement zal waarschijnlijk de hele tabel vergrendelen, terwijl het bij een index slechts enkele rijen vergrendelt. Omdat je niet de juiste rijen in de eerste instructie hebt vergrendeld, wordt een extra vergrendeling verkregen tijdens de tweede instructie.
Het is duidelijk dat een deadlock niet kan optreden als de hele tafel is vergrendeld (d.w.z. zonder een index). Een deadlock kan zeker optreden in de tweede setup.