Przejdź do głównej treści

Kwalifikacja: INF.03 - Tworzenie i administrowanie stronami i aplikacjami internetowymi oraz bazami danych

Zawód: Technik informatyk, Technik programista

Kategorie: Programowanie webowe Bazy danych PHP

Skrypt PHP rozpoczął transakcję funkcją mysqli_begin_transaction($polaczenie) i wykonał na tabeli InnoDB dwa zapytania UPDATE. Drugie zapytanie zakończyło się błędem. Którą funkcję należy wywołać, aby wycofać zmiany wprowadzone przez pierwsze zapytanie?

A.
mysqli_affected_rows($polaczenie)
Źle. mysqli_affected_rows() podaje liczbę zmienionych wierszy i niczego nie wycofuje.
B.
mysqli_rollback($polaczenie)
Dobrze. mysqli_rollback() wycofuje wszystkie niezatwierdzone zmiany z bieżącej transakcji.
C.
mysqli_commit($polaczenie)
Źle. mysqli_commit() utrwaliłoby zmiany z pierwszego zapytania zamiast je cofnąć.
D.
mysqli_free_result($wynik)
Źle. mysqli_free_result() tylko zwalnia pamięć wyniku zapytania, danych nie zmienia.

Transakcja grupuje kilka zapytań w jedną całość: albo wszystkie zmiany zostaną utrwalone, albo żadna. Po mysqli_begin_transaction() zmiany wykonane przez kolejne zapytania nie są jeszcze zatwierdzone. Jeśli któreś zapytanie się nie powiedzie, wywołanie mysqli_rollback($polaczenie) cofa wszystko, co zrobiono od początku transakcji, i baza wraca do stanu sprzed niej.

Typowy schemat to przelew między kontami: odjęcie kwoty z jednego konta i dopisanie jej do drugiego muszą udać się razem. Gdy oba zapytania przejdą, wywołuje się mysqli_commit(), a przy błędzie mysqli_rollback(). Transakcje działają w tabelach InnoDB, a tabele MyISAM ich nie obsługują.

Najczęściej myli się tu zatwierdzenie z wycofaniem, bo obie funkcje kończą transakcję. mysqli_commit() robi jednak odwrotną rzecz: utrwala zmiany z pierwszego zapytania, więc po błędzie drugiego baza zostałaby w niespójnym stanie, na przykład z kwotą odjętą z jednego konta i nigdzie nie dopisaną.

mysqli_free_result() zwalnia pamięć zajmowaną przez wynik zapytania SELECT i nie ma żadnego wpływu na dane w tabeli ani na transakcję.

mysqli_affected_rows() tylko informuje, ile wierszy zmieniło ostatnie zapytanie. Przydaje się do sprawdzenia, czy operacja coś zmieniła, ale niczego nie cofa. Zmiany wycofuje wyłącznie funkcja mysqli_rollback(), wywołana przed zatwierdzeniem transakcji.

Przy zadaniach o transakcjach warto zapamiętać trzy kroki: rozpoczęcie, a potem zatwierdzenie, gdy wszystkie zapytania się udały, albo wycofanie, gdy którekolwiek z nich zakończyło się błędem. Kolejność ma znaczenie, bo zatwierdzonych zmian nie da się już cofnąć.

Wymagane logowanie

Ocenianie trudności pytań jest dostępne tylko dla zalogowanych użytkowników. Zaloguj się, aby skorzystać z pełni możliwości platformy.

Twoja ocena pomoże innym uczniom w przygotowaniu do egzaminu, a Tobie pozwoli na dostęp do spersonalizowanych statystyk.

Zgłoś błąd w pytaniu

Rozwiń sekcję i zmień pole, którego dotyczy błąd. Wysłane zostaną tylko zmienione sekcje.

Błędna kwalifikacja
Błąd w treści pytania
Błąd w treści odpowiedzi
Błąd w obrazie
Dane kontaktowe (opcjonalnie)
Podaj email, jeśli chcesz otrzymać informację o rozpatrzeniu zgłoszenia.