Mysql
 sql >> Base de données >  >> RDS >> Mysql

Les instructions mysql uniques sont-elles atomiques dans MyISAM et InnoDB ?

Oui et Non :-)

Dans les deux cas, l'accès est sérialisé (en supposant que vous utilisez un moteur transactionnel comme InnoDB) puisqu'ils touchent la même ligne, ils n'interféreront donc pas les uns avec les autres. En d'autres termes, les déclarations sont atomique.

Cependant, le nombre de lignes affectées dépend en réalité de votre jeu de configuration lorsque vous ouvrez la connexion. La page pour mysql_affected_rows() a ceci à dire (mon gras):

Et depuis la page mysql_real_connect :

Donc, en termes de ce qui se passe avec CLIENT_FOUND_ROWS en cours de configuration, les lignes affectées pour :

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

n'ont rien à voir si les données sont modifiées, uniquement les lignes correspondantes. Ce serait 1 pour les deux requêtes.

En revanche, si CLIENT_FOUND_ROWS n'était pas défini, la deuxième requête ne modifierait pas réellement la ligne (puisqu'elle est déjà remplie avec "dirty") et aurait un nombre de lignes de zéro.

Si vous vouliez le même quel que soit ce paramètre (ne montrant que les modifications), vous pouvez utiliser quelque chose comme :

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