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

Le singole istruzioni MySQL sono atomiche in MyISAM e InnoDB?

Sì e No :-)

In entrambi i casi, l'accesso viene serializzato (supponendo che tu stia utilizzando un motore transazionale come InnoDB) poiché colpiscono la stessa riga, quindi non interferiscono tra loro. In altre parole, le affermazioni sono atomico.

Tuttavia, il conteggio delle righe interessate dipende effettivamente dalla configurazione impostata quando si apre la connessione. La pagina per mysql_affected_rows() ha questo da dire (il mio grassetto):

E dalla la pagina mysql_real_connect :

Quindi, in termini di cosa succede con CLIENT_FOUND_ROWS in fase di configurazione, le righe interessate per:

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

non avere niente a che fare con se i dati sono modificati, solo le righe corrispondenti. Questo sarebbe 1 per entrambe le query.

D'altra parte, se CLIENT_FOUND_ROWS era non impostato, la seconda query non modificherebbe effettivamente la riga (poiché è già popolata con 'dirty') e avrebbe un conteggio di righe pari a zero.

Se volevi lo uguale comportamento indipendentemente da tale impostazione (mostrando solo le modifiche), potresti usare qualcosa come:

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