Z toho plynou dvě ponaučení:
- Zálohování dat
- V rámci transakce provádějte příkazy UPDATE/DELETE, abyste mohli použít
ROLLBACK
pokud věci nepůjdou podle plánu
Znalost manipulace s transakcemi (automatický, explicitní a implicitní) pro vaši databázi vám může ušetřit nutnost obnovovat data ze zálohy.
Transakce řídí příkaz(y) pro manipulaci s daty, aby bylo zajištěno, že jsou atomické. Být „atomový“ znamená, že k transakci buď dojde, nebo nenastane. Jediný způsob, jak signalizovat dokončení transakce do databáze, je buď pomocí COMMIT
nebo ROLLBACK
prohlášení (podle ANSI-92, které bohužel nezahrnovalo syntaxi pro vytvoření/zahájení transakce, takže je specifické pro dodavatele). COMMIT
použije změny (pokud nějaké) provedené v rámci transakce. ROLLBACK
ignoruje jakoukoli akci, která se v rámci transakce odehrála – vysoce žádoucí, když příkaz UPDATE/DELETE provede něco nezamýšleného .
Typicky jsou jednotlivé příkazy DML (Insert, Update, Delete) prováděny v transakci automatického potvrzení – jsou potvrzeny, jakmile je příkaz úspěšně dokončen. Což znamená, že v případech, jako je ten váš, není možné vrátit databázi do stavu před spuštěním příkazu. Když se něco pokazí, jedinou dostupnou možností obnovení je rekonstruovat data ze zálohy (pokud taková existuje). V MySQL je automatický závazek na ve výchozím nastavení pro InnoDB - MyISAM nepodporuje transakce. Lze jej deaktivovat pomocí:
SET autocommit = 0
Explicitní transakce je, když jsou příkazy zabaleny do explicitně definovaného bloku kódu transakce - pro MySQL je to START TRANSACTION
. Vyžaduje také explicitně provedené COMMIT
nebo ROLLBACK
výpis na konci transakce. Vnořené transakce přesahují rámec tohoto tématu.
Implicitní transakce se mírně liší od explicitních. Implicitní transakce nevyžadují explicitní definování transakce. Stejně jako explicitní transakce však vyžadují COMMIT
nebo ROLLBACK
prohlášení, které má být dodáno.
Závěr
Explicitní transakce jsou nejideálnějším řešením – vyžadují prohlášení COMMIT
nebo ROLLBACK
, dokončit transakci, a co se děje, je jasně uvedeno, aby si to ostatní v případě potřeby mohli přečíst. Implicitní transakce jsou v pořádku, pokud pracujete s databází interaktivně, ale COMMIT
prohlášení by měla být specifikována až poté, co byly výsledky otestovány a důkladně potvrzeny jako platné.
To znamená, že byste měli použít:
SET autocommit = 0;
START TRANSACTION;
UPDATE ...;
...a používejte pouze COMMIT;
když jsou výsledky správné.
To znamená, že příkazy UPDATE a DELETE obvykle vracejí pouze počet ovlivněných řádků, nikoli konkrétní podrobnosti. Převeďte taková prohlášení na příkazy SELECT a zkontrolujte výsledky, abyste zajistili správnost předem k pokusu o příkaz UPDATE/DELETE.
Dodatek
Příkazy DDL (Data Definition Language) jsou automaticky potvrzeny – nevyžadují příkaz COMMIT. IE:Příkazy k vytvoření nebo změně tabulky, indexu, uložené procedury, databáze a pohledu.