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

Er enkelte mysql-udsagn atomare i MyISAM og InnoDB?

Ja og nej :-)

I begge tilfælde er adgangen serialiseret (forudsat at du bruger en transaktionsmotor som InnoDB), da de rammer den samme række, så de vil ikke forstyrre hinanden. Med andre ord, udsagn er atomare.

Det berørte rækkeantal afhænger dog faktisk af dit konfigurationssæt, når du åbner forbindelsen. siden for mysql_affected_rows() har dette at sige (min fed):

Og fra mysql_real_connect-siden :

Altså med hensyn til hvad der sker med CLIENT_FOUND_ROWS bliver konfigureret, de berørte rækker for:

UPDATE T1 SET C1 = 'dirty' WHERE id = 1

har ingenting at gøre med, om dataene er ændret, kun hvilke rækker matchede. Dette ville være 1 for begge forespørgsler.

På den anden side, hvis CLIENT_FOUND_ROWS var ikke indstillet, ville den anden forespørgsel faktisk ikke ændre rækken (da den allerede er udfyldt med 'dirty') og ville have et rækkeantal på nul.

Hvis du ville have det samme adfærd uanset denne indstilling (viser kun ændringer), kan du bruge noget som:

UPDATE T1 SET C1 = 'dirty' WHERE id = 1 AND C1 <> 'dirty'


  1. Kaldning af en lagret procedure inden for en lagret procedure

  2. Hvornår opdaterer MySQL indekserne

  3. MySQL erstatter alle mellemrum med -

  4. Er der en måde at oprette tids-/nodebaseret UUID i PHP med tilbagevirkende kraft?