sql >> Databasteknik >  >> RDS >> Mysql

Är enstaka mysql-satser atomära i MyISAM och InnoDB?

Ja och nej :-)

I båda fallen är åtkomsten serialiserad (förutsatt att du använder en transaktionsmotor som InnoDB) eftersom de träffar samma rad, så de kommer inte att störa varandra. Med andra ord, påståendena är atomär.

Men antalet rader som påverkas beror faktiskt på din konfigurationsuppsättning när du öppnar anslutningen. sidan för mysql_affected_rows() har detta att säga (min fetstil):

Och från mysql_real_connect-sidan :

Så när det gäller vad som händer med CLIENT_FOUND_ROWS konfigureras, de berörda raderna för:

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

har inget att göra med om data ändras, bara de rader som matchade. Detta skulle vara 1 för båda frågorna.

Å andra sidan, om CLIENT_FOUND_ROWS var inte inställd, skulle den andra frågan faktiskt inte ändra raden (eftersom den redan är fylld med "smutsig") och skulle ha ett radantal på noll.

Om du ville ha samma beteende oavsett den inställningen (visar bara ändringar) kan du använda något som:

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


  1. Det gick inte att byta namn på en kolumn i MySQL

  2. Hur man extraherar eller konverterar tidsdata från en sträng i SQL Server

  3. Infoga array av poster i mysql med Node JS

  4. Formatera siffror genom att fylla med inledande nollor i SQL Server