sql >> Database teknologi >  >> RDS >> Mysql

Minimalt eksempel på brug af vælg... til opdatering for at isolere rækker

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.




  1. Hvordan overfører jeg min MySQL-database til en anden computer?

  2. T-SQL tirsdag #33:Trick Shots:Skema Switch-A-Roo

  3. Indlæser .sql-filer fra PHP

  4. 4 måder at få en lagret procedures definition ved hjælp af Transact-SQL