sql >> Databasteknik >  >> RDS >> Mysql

Återställning efter fel MySQL-uppdateringsfråga?

Det finns två lärdomar att dra här:

  1. Säkerhetskopiera data
  2. Utför UPDATE/DELETE-satser i en transaktion, så att du kan använda ROLLBACK om saker och ting inte går som planerat

Att vara medveten om transaktionshanteringen (autocommit, explicit och implicit) för din databas kan rädda dig från att behöva återställa data från en säkerhetskopia.

Transaktioner kontrollerar datamanipulation(er) för att säkerställa att de är atomära. Att vara "atomär" betyder att transaktionen antingen sker eller inte. Det enda sättet att signalera slutförandet av transaktionen till databasen är att använda antingen en COMMIT eller ROLLBACK uttalande (enligt ANSI-92, som tyvärr inte inkluderade syntax för att skapa/starta en transaktion så den är leverantörsspecifik). COMMIT tillämpar ändringarna (om några) som gjorts inom transaktionen. ROLLBACK bortser från alla åtgärder som ägde rum inom transaktionen - mycket önskvärt när en UPDATE/DELETE-sats gör något oavsiktligt .

Vanligtvis utförs individuella DML-satser (Infoga, Uppdatera, Ta bort) i en autocommit-transaktion - de committeras så snart uttalandet har slutförts. Vilket innebär att det inte finns någon möjlighet att återställa databasen till det tillstånd som fanns innan uttalandet kördes i fall som ditt. När något går fel är det enda tillgängliga återställningsalternativet att rekonstruera data från en säkerhetskopia (förutsatt att en sådan finns). I MySQL är autocommit som standard för InnoDB - MyISAM stöder inte transaktioner. Det kan inaktiveras genom att använda:

SET autocommit = 0

En explicit transaktion är när uttalande(n) är insvept i ett explicit definierat transaktionskodblock - för MySQL är det START TRANSACTION . Det kräver också en uttryckligen gjord COMMIT eller ROLLBACK uttalande i slutet av transaktionen. Kapslade transaktioner ligger utanför detta ämnes omfattning.

Implicita transaktioner skiljer sig något från explicita. Implicita transaktioner kräver inte explicit definition av en transaktion. Men precis som explicita transaktioner kräver de en COMMIT eller ROLLBACK redogörelse som ska tillhandahållas.

Slutsats

Explicita transaktioner är den mest idealiska lösningen - de kräver ett uttalande, COMMIT eller ROLLBACK , för att slutföra transaktionen, och vad som händer står tydligt för andra att läsa om det skulle behövas. Implicita transaktioner är OK om du arbetar med databasen interaktivt, men COMMIT påståenden bör endast specificeras när resultaten har testats och grundligt fastställts vara giltiga.

Det betyder att du bör använda:

SET autocommit = 0;

START TRANSACTION;
  UPDATE ...;

...och använd bara COMMIT; när resultaten är korrekta.

Som sagt, UPDATE- och DELETE-satser returnerar vanligtvis bara antalet rader som påverkas, inte specifika detaljer. Konvertera sådana uttalanden till SELECT-satser och granska resultaten för att säkerställa korrekthet före för att försöka UPDATE/DELETE-satsen.

Tillägg

DDL-satser (Data Definition Language) committeras automatiskt - de kräver ingen COMMIT-sats. IE:tabell, index, lagrad procedur, databas och visningsskapande eller ändringssatser.



  1. Hur man ansluter till MySQL-databas

  2. Hur man ställer in asynkron replikering mellan MariaDB Galera-kluster

  3. MyBatis RowBounds begränsar inte frågeresultat

  4. Hur kör man inbyggda SQL-frågor i samma Hibernate-transaktion?