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

La jointure insert/update sur MySQL est-elle une opération atomique ?

Je comprends votre question comme "chacune de ces requêtes est-elle en soi une opération atomique?". Alors la réponse est "oui". Les deux autres réponses sont justes, quand elles disent que toutes vos déclarations ensemble ne sont pas atomiques.

L'atomicité dans les bases de données signifie uniquement tout ou rien. Cela ne signifie pas exactitude des données. Votre déclaration réussit ou non. Cela n'a rien à voir avec les jointures ou les sous-requêtes. Une instruction est une instruction, peu importe si votre base de données doit utiliser une table temporaire en mémoire ou sur disque ou non.

Les transactions indiquent simplement à votre base de données de traiter plusieurs déclarations comme une seule déclaration. Lorsque l'une des instructions échoue, toutes sont annulées.

Un sujet connexe important ici est le niveau d'isolement . Vous voudrez peut-être en savoir plus à ce sujet.

EDIT (pour répondre au commentaire) :

C'est vrai. Tant qu'il s'agit d'une instruction valide et qu'aucune panne de courant ne se produit ou d'autres raisons pour lesquelles une requête pourrait échouer, elle est effectuée. L'atomicité en elle-même garantit simplement que la ou les déclarations sont faites ou non. Il garantit l'exhaustivité et que les données ne sont pas corrompues (parce qu'une opération d'écriture ne s'est pas terminée ou quelque chose comme ça). Cela ne vous garantit pas l'exactitude des données. Étant donné une requête comme INSERT INTO foo SELECT MAX(id) + 1 FROM bar; vous devez vous assurer en définissant le bon niveau d'isolement , que vous n'obtenez pas de lectures fantômes ou quoi que ce soit.