sql >> Database >  >> RDS >> Mysql

Zijn enkele mysql-statements atomair in MyISAM en InnoDB?

Ja en Nee :-)

In beide gevallen is de toegang geserialiseerd (ervan uitgaande dat je een transactie-engine zoals InnoDB gebruikt) omdat ze dezelfde rij raken, zodat ze elkaar niet hinderen. Met andere woorden, de uitspraken zijn atomair.

Het aantal betrokken rijen hangt echter af van uw configuratieset wanneer u de verbinding opent. De pagina voor mysql_affected_rows() heeft dit te zeggen (mijn vetgedrukt):

En van de mysql_real_connect-pagina :

Dus, in termen van wat er gebeurt met CLIENT_FOUND_ROWS worden geconfigureerd, de betreffende rijen voor:

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

heb niets te maken hebben met of de gegevens gewijzigd zijn, alleen welke rijen overeenkomen. Dit zou 1 zijn voor beide zoekopdrachten.

Aan de andere kant, als CLIENT_FOUND_ROWS was niet ingesteld, zou de tweede query de rij niet daadwerkelijk veranderen (omdat deze al is gevuld met 'dirty') en zou het aantal rijen nul zijn.

Als je hetzelfde wilde gedrag ongeacht die instelling (laat alleen wijzigingen zien), je zou zoiets kunnen gebruiken als:

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


  1. ORA-12514 TNS:luisteraar weet momenteel niet welke service is aangevraagd in connect-descriptor

  2. PIVOT in sql 2005

  3. AWS RDS-parametergroep verandert de MySQL-codering niet

  4. Hotelkamerprijzen voor verschillende seizoenen