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

Hvordan sikrer man sig, at der ikke er nogen racetilstand i MySQL-databasen, når man øger et felt?

Her er 3 forskellige tilgange:

Atomic opdatering

update table set tries=tries+1 where condition=value;

og det vil blive gjort atomært.

Brug transaktioner

Hvis du først skal vælge værdien og opdatere den i din applikation, skal du sandsynligvis bruge transaktioner. Det betyder, at du bliver nødt til at bruge InnoDB, ikke MyISAM-tabeller. Din forespørgsel ville være noget i retning af:

BEGIN; //or any method in the API you use that starts a transaction
select tries from table where condition=value for update;
.. do application logic to add to `tries`
update table set tries=newvalue where condition=value;
END;

hvis transaktionen mislykkes, skal du muligvis manuelt prøve den igen.

Versionsskema

En almindelig tilgang er at introducere en versionskolonne i din tabel. Dine forespørgsler ville gøre noget som:

select tries,version from table where condition=value;
.. do application logic, and remember the old version value.
update table set tries=newvalue,version=version + 1 where condition=value and version=oldversion;

Hvis denne opdatering mislykkes/returnerer 0 berørte rækker, har en anden opdateret tabellen i mellemtiden. Du skal starte forfra - det vil sige, vælg de nye værdier, lav applikationslogikken og prøv opdateringen igen.



  1. Aspekter af strenge i .NET

  2. CakePHP bruger flere databaser til modeller

  3. Forskellen mellem VARCHAR og TEXT i MySQL

  4. Sådan gemmer du sqlite-database direkte på sdcard