Det kan være nyttigt at se på, hvordan denne forespørgsel faktisk udføres af MySQL:
select * from tbl_codes where available = 1 order by rand() limit 1 for update
Dette vil læse og sortere alle rækker, der matcher WHERE
betingelse, generer et tilfældigt tal ved hjælp af rand()
i en virtuel kolonne for hver række, sorter alle rækker (i en midlertidig tabel) baseret på den virtuelle kolonne, og returner derefter rækker til klienten fra det sorterede sæt indtil LIMIT
er nået (i dette tilfælde kun én).
Bortset fra de åbenlyse præstationsimplikationer af ovenstående (det er forfærdeligt), vil du aldrig få rimelig låseadfærd af det.
Kort svar:
- Vælg den ønskede række ved hjælp af
RAND()
eller enhver anden strategi, du kan lide, for at finde denPRIMÆR NØGLE
værdien af denne række. F.eks.:SELECT id FROM tbl_codes WHERE available =1 ORDER BY rand() LIMIT 1
- Lås den ønskede række ved hjælp af dens
PRIMÆR NØGLE
kun. F.eks.:SELECT * FROM tbl_codes WHERE id =N
Forhåbentlig hjælper det.