sql >> Databasteknik >  >> RDS >> Mysql

Hur försäkrar man sig om att det inte finns något rastillstånd i MySQL-databasen när man ökar ett fält?

Här är 3 olika tillvägagångssätt:

Atomic-uppdatering

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

och det kommer att göras atomärt.

Använd transaktioner

Om du måste först välja värdet och uppdatera det i din applikation, behöver du förmodligen använda transaktioner. Det betyder att du måste använda InnoDB, inte MyISAM-tabeller. Din fråga skulle vara något i stil med:

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;

om transaktionen misslyckas kan du behöva försöka manuellt igen.

Versionsschema

Ett vanligt tillvägagångssätt är att introducera en versionskolumn i din tabell. Dina frågor skulle göra något i stil med:

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;

Om den uppdateringen misslyckas/returerar 0 påverkade rader, har någon annan uppdaterat tabellen under tiden. Du måste börja om från början - det vill säga, välj de nya värdena, gör applikationslogiken och försök uppdateringen igen.



  1. Beräkna ålder i MySQL (InnoDb)

  2. Vad är PL/SQL-lagrade procedurer i Oracle Database

  3. Hanterar ExecuteScalar() när inga resultat returneras

  4. PHP hämta data från tabellraden och lagra till variabel