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

Gendannelse efter forkert MySQL-opdateringsforespørgsel?

Der er to lektioner at lære her:

  1. Sikkerhedskopidata
  2. Udfør UPDATE/DELETE-udsagn i en transaktion, så du kan bruge ROLLBACK hvis tingene ikke går som planlagt

At være opmærksom på transaktionshåndteringen (autocommit, eksplicit og implicit) for din database kan spare dig for at skulle gendanne data fra en sikkerhedskopi.

Transaktioner kontrollerer datamanipulationserklæring(er) for at sikre, at de er atomare. At være "atomisk" betyder, at transaktionen enten finder sted, eller også gør den ikke. Den eneste måde at signalere fuldførelsen af ​​transaktionen til databasen er ved at bruge enten en COMMIT eller ROLLBACK erklæring (i henhold til ANSI-92, som desværre ikke indeholdt syntaks for at oprette/begynde en transaktion, så den er leverandørspecifik). COMMIT anvender de ændringer (hvis nogen) foretaget i transaktionen. ROLLBACK ignorerer de handlinger, der fandt sted inden for transaktionen - yderst ønskeligt, når en UPDATE/DELETE-erklæring gør noget utilsigtet .

Typisk udføres individuelle DML-udsagn (Indsæt, Opdater, Slet) i en autocommit-transaktion - de forpligtes, så snart opgørelsen er fuldført. Hvilket betyder, at der ikke er nogen mulighed for at rulle databasen tilbage til den tilstand, før erklæringen blev kørt i tilfælde som din. Når noget går galt, er den eneste tilgængelige gendannelsesmulighed at rekonstruere dataene fra en sikkerhedskopi (forudsat at en findes). I MySQL er autocommit som standard for InnoDB - MyISAM understøtter ikke transaktioner. Det kan deaktiveres ved at bruge:

SET autocommit = 0

En eksplicit transaktion er, når erklæring(er) er pakket ind i en eksplicit defineret transaktionskodeblok - for MySQL er det START TRANSACTION . Det kræver også en eksplicit lavet COMMIT eller ROLLBACK erklæring ved slutningen af ​​transaktionen. Indlejrede transaktioner er uden for dette emnes omfang.

Implicitte transaktioner er lidt forskellige fra eksplicitte. Implicitte transaktioner kræver ikke eksplicit definition af en transaktion. Men ligesom eksplicitte transaktioner kræver de en COMMIT eller ROLLBACK erklæring, der skal leveres.

Konklusion

Eksplicitte transaktioner er den mest ideelle løsning - de kræver en erklæring, COMMIT eller ROLLBACK , for at afslutte transaktionen, og hvad der sker er tydeligt angivet, som andre kan læse, hvis der skulle være behov for det. Implicitte transaktioner er OK, hvis du arbejder med databasen interaktivt, men COMMIT Udsagn bør kun specificeres, når resultaterne er blevet testet og grundigt fastslået at være gyldige.

Det betyder, at du skal bruge:

SET autocommit = 0;

START TRANSACTION;
  UPDATE ...;

...og brug kun COMMIT; når resultaterne er korrekte.

Når det er sagt, returnerer UPDATE- og DELETE-sætninger typisk kun antallet af berørte rækker, ikke specifikke detaljer. Konverter sådanne udsagn til SELECT-udsagn og gennemgå resultaterne for at sikre korrekthed forud for at forsøge UPDATE/DELETE-sætningen.

Tillæg

DDL-udsagn (Data Definition Language) bliver automatisk committet - de kræver ikke en COMMIT-sætning. IE:Udsagn om oprettelse eller ændring af tabel, indeks, lagret procedure, database og visning.



  1. Bruger du Mysqli bind_param med dato- og tidskolonner?

  2. Kan ikke vælge hvor ip=inet_pton($ip)

  3. Sikring af MySQL-server

  4. Sådan installeres sqlcmd &bcp på Red Hat