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

MySQL:Sådan opnås transaktionslåsning på rækkeniveau i stedet for tabellåsning

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). TIL OPDATERING påvirker låsning udført af hele sætningen, mens den udføres, og som sådan anvendes klausulen, når rækker læses inden for InnoDB , ikke efterhånden som de returneres til klienten.

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:

  1. Vælg den ønskede række ved hjælp af RAND() eller enhver anden strategi, du kan lide, for at finde den PRIMÆR NØGLE værdien af ​​denne række. F.eks.:SELECT id FROM tbl_codes WHERE available =1 ORDER BY rand() LIMIT 1
  2. 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.



  1. 4 nøgledatabaseovervågningsaktiviteter, som enhver DBA bør kende

  2. Fjern SCHEMABINDING fra en brugerdefineret funktion i SQL Server

  3. Sådan slipper du udenlandske nøglebegrænsninger i SQL Server-databasen for alle tabellerne - SQL Server / TSQL vejledning del 72

  4. Hvordan reducerer jeg størrelsen på min sql-serverlogfil?