sql >> Databáze >  >> RDS >> Mysql

MySQL Select... pro aktualizaci s indexem má problém se souběžností

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í.



  1. Kde je můj neplatný znak (ORA-00911)

  2. Selektor `field->key` v nástroji pro tvorbu dotazů Laravelu JSON způsobuje chybu syntaxe

  3. Zabránění vkládání SQL v ASP.Net

  4. Aktualizujte pomocí Join dotazu v Oracle