Er zijn hier twee lessen te leren:
- Back-upgegevens
- Voer UPDATE/DELETE-instructies uit binnen een transactie, zodat u
ROLLBACK
kunt gebruiken als dingen niet gaan zoals gepland
Als u op de hoogte bent van de transactieverwerking (autocommit, expliciete en impliciete) voor uw database, hoeft u geen gegevens te herstellen vanaf een back-up.
Transacties controleren verklaring(en) voor gegevensmanipulatie om ervoor te zorgen dat ze atomair zijn. "Atomair" zijn betekent dat de transactie plaatsvindt of niet. De enige manier om de voltooiing van de transactie aan de database aan te geven, is door een COMMIT
. te gebruiken of ROLLBACK
verklaring (volgens ANSI-92, die helaas geen syntaxis bevatte voor het maken/beginnen van een transactie, dus het is leverancierspecifiek). COMMIT
past de wijzigingen (indien van toepassing) toe die tijdens de transactie zijn aangebracht. ROLLBACK
negeert alle acties die binnen de transactie hebben plaatsgevonden - zeer wenselijk wanneer een UPDATE/DELETE-instructie iets onbedoeld doet .
Doorgaans worden individuele DML-instructies (Insert, Update, Delete) uitgevoerd in een autocommit-transactie - ze worden vastgelegd zodra de instructie met succes is voltooid. Wat betekent dat er geen mogelijkheid is om de database terug te draaien naar de staat voordat de instructie werd uitgevoerd in gevallen zoals die van u. Als er iets misgaat, is de enige beschikbare hersteloptie het reconstrueren van de gegevens vanaf een back-up (op voorwaarde dat deze bestaat). In MySQL is autocommit op standaard voor InnoDB - MyISAM ondersteunt geen transacties. Het kan worden uitgeschakeld met behulp van:
SET autocommit = 0
Een expliciete transactie is wanneer statement(s) zijn verpakt in een expliciet gedefinieerd transactiecodeblok - voor MySQL is dat START TRANSACTION
. Het vereist ook een expliciet gemaakte COMMIT
of ROLLBACK
verklaring aan het einde van de transactie. Geneste transacties vallen buiten het bestek van dit onderwerp.
Impliciete transacties zijn iets anders dan expliciete. Impliciete transacties vereisen geen expliciete definitie van een transactie. Echter, zoals expliciete transacties vereisen ze een COMMIT
of ROLLBACK
af te geven verklaring.
Conclusie
Expliciete transacties zijn de meest ideale oplossing - ze vereisen een verklaring, COMMIT
of ROLLBACK
, om de transactie af te ronden, en wat er gebeurt, wordt duidelijk vermeld zodat anderen het kunnen lezen als dat nodig is. Impliciete transacties zijn OK als interactief met de database wordt gewerkt, maar COMMIT
verklaringen mogen alleen worden gespecificeerd nadat de resultaten zijn getest en grondig zijn vastgesteld om geldig te zijn.
Dat betekent dat je het volgende moet gebruiken:
SET autocommit = 0;
START TRANSACTION;
UPDATE ...;
...en gebruik alleen COMMIT;
wanneer de resultaten correct zijn.
Dat gezegd hebbende, UPDATE- en DELETE-instructies retourneren meestal alleen het aantal betrokken rijen, niet specifieke details. Zet dergelijke uitspraken om in SELECT-instructies en bekijk de resultaten om de juistheid te verzekeren vooraf om de UPDATE/DELETE-instructie te proberen.
Aanvulling
DDL-instructies (Data Definition Language) worden automatisch vastgelegd - ze vereisen geen COMMIT-instructie. IE:Tabel, index, opgeslagen procedure, database en instructies voor het maken of wijzigen van weergaven.