sql >> Databasteknik >  >> RDS >> Mysql

Skillnaden mellan SET autocommit=1 och START TRANSACTION i mysql (har jag missat något?)

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 datamanipuleringsuttalanden 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. Den 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 uttalanden 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 hittar poster med NULL i en kolumn

  2. Hur skickar man ett argument till ett PL/SQL-block i en sql-fil som heter med START i sqlplus?

  3. Vad är skillnaden mellan ett Oracle- och ett Microsoft-schema?

  4. Hur ändrar jag en MySQL-kolumn för att tillåta NULL?