SELECT ... FOR UPDATE
låser raden/raderna i exklusivt läge, vilket innebär att det andra valet inte kan fortsätta förrän det första har slutförts eller rullats tillbaka. Detta beror på att resultatet av den andra markeringen kan påverkas av innehållet i raden du har låst, så det måste få ett läslås till raden för att kontrollera det.
Om du skapar ett UNIQUE INDEX
på till exempel id
, du skulle kunna göra;
select * from SolrCoresPreallocated where id=1 for update;
i den första transaktionen och;
select * from SolrCoresPreallocated where id=2 for update;
i den andra oberoende, eftersom det unika indexet låter den andra väljaren hitta rätt rad utan att läslåsa den första.
EDIT:För att få en "gratis" rad så snabbt som möjligt är det enda sättet att göra två transaktioner;
- BÖRJA/VÄLJ FÖR UPPDATERING/UPPDATERA till upptagen/KOMMITT för att hämta raden.
- BÖRJA/
/UPPDATERA för att frigöra/BETA för att bearbeta raden och släppa den.
Detta innebär att du kan behöva kompenserande åtgärder om en process misslyckas och återställer transaktionen som skulle UPPDATERA raden till ledig, men eftersom MySQL (eller standard SQL för den delen) inte har en föreställning om "få nästa olåsta rad ", du har inte många alternativ.