Można tutaj wyciągnąć dwie lekcje:
- Dane kopii zapasowej
- Wykonywanie instrukcji UPDATE/DELETE w ramach transakcji, dzięki czemu możesz użyć
ROLLBACK
jeśli sprawy nie idą zgodnie z planem
Świadomość obsługi transakcji (autocommit, jawna i niejawna) dla Twojej bazy danych może oszczędzić Ci konieczności przywracania danych z kopii zapasowej.
Transakcje kontrolują instrukcje manipulacji danymi, aby upewnić się, że są niepodzielne. Bycie „atomowym” oznacza, że transakcja albo występuje, albo nie. Jedynym sposobem zasygnalizowania zakończenia transakcji do bazy danych jest użycie COMMIT
lub ROLLBACK
oświadczenie (zgodnie z ANSI-92, które niestety nie zawierało składni tworzenia/rozpoczynania transakcji, więc jest zależne od dostawcy). COMMIT
stosuje zmiany (jeśli występują) wprowadzone w ramach transakcji. ROLLBACK
pomija wszelkie działania, które miały miejsce w ramach transakcji - wysoce pożądane, gdy instrukcja UPDATE/DELETE robi coś niezamierzonego .
Zazwyczaj pojedyncze instrukcje DML (Insert, Update, Delete) są wykonywane w transakcji autocommit — są one zatwierdzane, gdy tylko instrukcja zostanie pomyślnie zakończona. Co oznacza, że nie ma możliwości przywrócenia bazy danych do stanu sprzed uruchomienia instrukcji w przypadkach takich jak twój. Gdy coś pójdzie nie tak, jedyną dostępną opcją przywrócenia jest zrekonstruowanie danych z kopii zapasowej (o ile taka istnieje). W MySQL autocommit to na domyślnie dla InnoDB - MyISAM nie obsługuje transakcji. Można go wyłączyć za pomocą:
SET autocommit = 0
Transakcja jawna ma miejsce, gdy wyciągi są opakowane w wyraźnie zdefiniowany blok kodu transakcji - dla MySQL jest to START TRANSACTION
. Wymaga również jawnie wykonanego COMMIT
lub ROLLBACK
oświadczenie na koniec transakcji. Transakcje zagnieżdżone wykraczają poza zakres tego tematu.
Transakcje niejawne różnią się nieco od transakcji jawnych. Transakcje niejawne nie wymagają jawnego definiowania transakcji. Jednak, podobnie jak transakcje jawne, wymagają COMMIT
lub ROLLBACK
oświadczenie, które należy dostarczyć.
Wniosek
Transakcje jawne są najbardziej idealnym rozwiązaniem - wymagają oświadczenia, COMMIT
lub ROLLBACK
, aby sfinalizować transakcję, a to, co się dzieje, jest jasno określone, aby inni mogli je przeczytać, jeśli zajdzie taka potrzeba. Transakcje niejawne są w porządku, jeśli interaktywnie pracujesz z bazą danych, ale COMMIT
Oświadczenia należy podawać dopiero po przetestowaniu wyników i dokładnym ustaleniu ich poprawności.
Oznacza to, że powinieneś użyć:
SET autocommit = 0;
START TRANSACTION;
UPDATE ...;
...i używaj tylko COMMIT;
kiedy wyniki są prawidłowe.
To powiedziawszy, instrukcje UPDATE i DELETE zazwyczaj zwracają tylko liczbę wierszy, których to dotyczy, a nie konkretne szczegóły. Przekształć takie stwierdzenia w wyrażenia SELECT i przejrzyj wyniki, aby upewnić się, że są one poprawne wcześniej do próby wykonania instrukcji UPDATE/DELETE.
Uzupełnienie
Instrukcje DDL (Data Definition Language) są zatwierdzane automatycznie — nie wymagają instrukcji COMMIT. IE:Tabela, indeks, procedura składowana, baza danych i instrukcje tworzenia lub zmiany widoku.