Det finns två lärdomar att dra här:
- Säkerhetskopiera data
- 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 på 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.