sql >> Databáze >  >> RDS >> Mysql

Obnova po nesprávném dotazu na aktualizaci MySQL?

Z toho plynou dvě ponaučení:

  1. Zálohování dat
  2. 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.



  1. Opakovaný pokus o objednávku stolu

  2. Jak mohu odstranit zablokování transakce?

  3. Max tabulky a designový vzor

  4. Jak načíst data JSON z MySQL?