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

Join insert/update su MySQL è un'operazione atomica?

Capisco la tua domanda come "ciascuna di queste query è di per sé un'operazione atomica?". Allora la risposta è "sì". Le altre due risposte sono giuste, quando dicono che tutte le tue affermazioni insieme non sono atomiche.

Atomicità nei database significa solo tutto o niente. Non significa correttezza dei dati. La tua affermazione ha successo o no. Non ha nulla a che fare con join o sottoquery. Un'istruzione è un'istruzione, indipendentemente dal fatto che il database debba utilizzare una tabella temporanea in memoria o su disco o meno.

Le transazioni dicono semplicemente al tuo database di trattare più dichiarazioni come un'unica dichiarazione. Quando una delle istruzioni ha esito negativo, viene eseguito il rollback di tutte.

Un importante argomento correlato qui è il livello di isolamento . Potresti voler leggere su quelli.

EDIT (per rispondere al commento):

Giusto. Finché si tratta di un'istruzione valida e non si verifica un'interruzione di corrente o altri motivi per cui una query potrebbe non riuscire, viene eseguita. L'atomicità di per sé garantisce semplicemente che le affermazioni siano state fatte o meno. Garantisce la completezza e che i dati non siano corrotti (perché un'operazione di scrittura non è terminata o qualcosa del genere). Non ti garantisce la correttezza dei dati. Data una query come INSERT INTO foo SELECT MAX(id) + 1 FROM bar; devi assicurarti impostando il livello di isolamento corretto , che non ricevi letture fantasma o altro.