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

Rozdíl mezi SET autocommit=1 a START TRANSACTION v mysql (Přehlédl jsem něco?)

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 zakázat 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í mohli v případě potřeby 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. Co jsou makra a jak je mohu používat?

  2. Jak používat _COUNT v BaseColumns

  3. ORA-01658:nelze vytvořit INITIAL rozsah pro segment v tabulkovém prostoru TS_DATA

  4. Druh, který se rozlije na úroveň 15 000