sql >> Database >  >> RDS >> Mysql

Hoe zorg ik ervoor dat er geen raceconditie is in de MySQL-database bij het verhogen van een veld?

Hier zijn 3 verschillende benaderingen:

Atoomupdate

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

en het zal atomair gebeuren.

Transacties gebruiken

Als u eerst de waarde moet selecteren en bijwerken in uw toepassing, moet u waarschijnlijk transacties gebruiken. Dat betekent dat u InnoDB moet gebruiken, niet MyISAM-tabellen. Uw vraag zou zoiets zijn als:

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;

als de transactie mislukt, moet u deze mogelijk handmatig opnieuw proberen.

Versieschema

Een veelgebruikte benadering is om een ​​versiekolom in uw tabel te introduceren. Uw vragen zouden zoiets doen als:

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;

Als die update mislukt / 0 betrokken rijen oplevert, heeft iemand anders de tabel ondertussen bijgewerkt. U moet helemaal opnieuw beginnen - dat wil zeggen, de nieuwe waarden selecteren, de toepassingslogica uitvoeren en de update opnieuw proberen.



  1. Oracle leest bestand uit directory met uitzondering

  2. Hoe mysqli te laten werken met DELIMITER's in SQL-statements?

  3. Hoe krijg ik met MS SQL een duidelijke lijst van woorden die in alle Field Records worden gebruikt?

  4. MIN en MAX geaggregeerde functies in SQL Server