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

MySQL transakční hlavolam

MySQL předá volajícímu chybový kód a na základě tohoto chybového kódu se volající může svobodně rozhodnout, zda chce provést dosud vykonanou práci (chybu s tímto konkrétním INSERT ignoruje výpis) nebo k vrácení transakce.

To je na rozdíl od PostgreSQL který vždy při chybě přeruší transakci a toto chování je zdrojem mnoha problémů.

Aktualizace:

Je špatné používat bezpodmínečné ROLLBACK uvnitř uložených procedur.

Uložené procedury jsou stohovatelné a transakce nikoli, takže ROLLBACK uvnitř vnořené uložené procedury se vrátí zpět na úplný začátek transakce, nikoli do stavu provedení uložené procedury.

Pokud chcete použít transakce k obnovení stavu databáze při chybách, použijte SAVEPOINT konstrukty a DECLARE HANDLER pro návrat k uloženým bodům:

CREATE PROCEDURE prc_work()
BEGIN
        DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK TO sp_prc_work;
        SAVEPOINT sp_prc_work;
        INSERT  …;
        INSERT  …;
        …
END;

Selhání kteréhokoli vložení vrátí zpět všechny změny provedené procedurou a ukončí ji.



  1. Otázka AKTUALIZACE DUPLIKÁTNÍHO KLÍČE MYSQL

  2. Vložit do tabulky z Array PHP

  3. Kombinujte více příkazů SELECT

  4. prázdný řetězec v orákulu