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

Recupero dopo una query di aggiornamento MySQL errata?

Ci sono due lezioni da imparare qui:

  1. Backup dei dati
  2. Esegui istruzioni UPDATE/DELETE all'interno di una transazione, in modo da poter utilizzare ROLLBACK se le cose non vanno come previsto

Essere a conoscenza della gestione della transazione (autocommit, esplicita e implicita) per il tuo database può evitarti di dover ripristinare i dati da un backup.

Le transazioni controllano le istruzioni di manipolazione dei dati per garantire che siano atomiche. Essere "atomico" significa che la transazione si verifica o non accade. L'unico modo per segnalare il completamento della transazione al database è utilizzare un COMMIT o ROLLBACK dichiarazione (secondo ANSI-92, che purtroppo non includeva la sintassi per la creazione/l'inizio di una transazione, quindi è specifica del fornitore). COMMIT applica le modifiche (se presenti) apportate all'interno della transazione. ROLLBACK ignora qualsiasi azione abbia avuto luogo all'interno della transazione - altamente auspicabile quando un'istruzione UPDATE/DELETE fa qualcosa di non intenzionale .

In genere, le singole istruzioni DML (Inserisci, Aggiorna, Elimina) vengono eseguite in una transazione di commit automatico:vengono salvate non appena l'istruzione viene completata correttamente. Il che significa che non c'è alcuna possibilità di ripristinare il database allo stato precedente all'esecuzione dell'istruzione in casi come il tuo. Quando qualcosa va storto, l'unica opzione di ripristino disponibile è ricostruire i dati da un backup (ammesso che ne esista uno). In MySQL, autocommit è su per impostazione predefinita per InnoDB - MyISAM non supporta le transazioni. Può essere disabilitato utilizzando:

SET autocommit = 0

Una transazione esplicita è quando le istruzioni sono racchiuse in un blocco di codice di transazione definito in modo esplicito - per MySQL, è START TRANSACTION . Richiede anche un COMMIT esplicitamente creato o ROLLBACK dichiarazione al termine della transazione. Le transazioni nidificate esulano dall'ambito di questo argomento.

Le transazioni implicite sono leggermente diverse da quelle esplicite. Le transazioni implicite non richiedono la definizione esplicita di una transazione. Tuttavia, come le transazioni esplicite, richiedono un COMMIT o ROLLBACK dichiarazione da fornire.

Conclusione

Le transazioni esplicite sono la soluzione ideale:richiedono una dichiarazione, COMMIT o ROLLBACK , per finalizzare la transazione e ciò che sta accadendo è chiaramente indicato per essere letto da altri in caso di necessità. Le transazioni implicite vanno bene se si lavora con il database in modo interattivo, ma COMMIT le dichiarazioni dovrebbero essere specificate solo dopo che i risultati sono stati testati e accuratamente determinati per essere validi.

Ciò significa che dovresti usare:

SET autocommit = 0;

START TRANSACTION;
  UPDATE ...;

...e usa solo COMMIT; quando i risultati sono corretti.

Detto questo, le istruzioni UPDATE e DELETE in genere restituiscono solo il numero di righe interessate, non dettagli specifici. Converti tali affermazioni in dichiarazioni SELECT ed esamina i risultati per assicurarne la correttezza prima per tentare l'istruzione UPDATE/DELETE.

Addendum

Le istruzioni DDL (Data Definition Language) vengono automaticamente salvate e non richiedono un'istruzione COMMIT. IE:tabelle, indici, stored procedure, database e istruzioni di creazione o modifica della vista.