Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zagadka dotycząca transakcji MySQL

MySQL przekazuje kod błędu do wywołującego i w oparciu o ten kod błędu, wywołujący może swobodnie zdecydować, czy chce zatwierdzić pracę wykonaną do tej pory (ignorując błąd z tym konkretnym INSERT oświadczenie) lub wycofać transakcję.

To różni się od PostgreSQL który zawsze przerywa transakcję w przypadku błędu i takie zachowanie jest źródłem wielu problemów.

Aktualizacja:

Złą praktyką jest używanie bezwarunkowego ROLLBACK wewnątrz procedur składowanych.

Procedury składowane można układać w stosy, a transakcje nie, więc funkcja ROLLBACK w zagnieżdżonej procedurze składowanej cofnie się do samego początku transakcji, a nie do stanu wykonania procedury składowanej.

Jeśli chcesz użyć transakcji do przywrócenia stanu bazy danych w przypadku błędów, użyj SAVEPOINT konstrukcje i DECLARE HANDLER aby cofnąć się do punktów zapisu:

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

Niepowodzenie jednej z wstawek spowoduje wycofanie wszystkich zmian wprowadzonych przez procedurę i wyjście z niej.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przenoszenie kolumn tekstowych szerokości/długości geograficznej do kolumny typu „punkt”

  2. Błąd XML w ampersand (&)

  3. MySQL:transakcje w wielu wątkach

  4. unikalny identyfikator w więcej niż jednej tabeli [MySQL]

  5. Wstaw tablicę PDO używając klucza jako nazwy kolumny