SELECT ... FOR UPDATE
låser rækken/rækkerne i eksklusiv tilstand, hvilket betyder, at det andet valg ikke kan fortsætte, før det første er afsluttet eller rullet tilbage. Dette skyldes, at det andet udvalgs resultat kan blive påvirket af indholdet af den række, du har låst, så den skal have en læselås til rækken for at kontrollere.
Hvis du opretter et UNIQUE INDEX
på for eksempel id
, du kunne gøre;
select * from SolrCoresPreallocated where id=1 for update;
i den første transaktion og;
select * from SolrCoresPreallocated where id=2 for update;
i den anden uafhængigt, da det unikke indeks lader det andet udvalg finde den rigtige række uden at læse-låse den første.
EDIT:For at få en "gratis" række så hurtigt som muligt, er den eneste måde virkelig at udføre to transaktioner;
- BEGIN/VÆLG FOR OPDATERING/OPDATERING til optaget/COMMIT for at hente rækken.
- BEGIN/
/OPDATERE for at frigøre/FORSAGT for at behandle rækken og frigive den.
Dette betyder, at du muligvis har brug for kompenserende handlinger, hvis en proces mislykkes og ruller transaktionen tilbage, der ville OPDATERE rækken til fri, men da MySQL (eller standard SQL for den sags skyld) ikke har en forestilling om "få den næste ulåste række ", du har ikke mange muligheder.