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?
mysqli_affected_rows($polaczenie)
mysqli_affected_rows() podaje liczbę zmienionych wierszy i niczego nie wycofuje.mysqli_rollback($polaczenie)
mysqli_rollback() wycofuje wszystkie niezatwierdzone zmiany z bieżącej transakcji.mysqli_commit($polaczenie)
mysqli_commit() utrwaliłoby zmiany z pierwszego zapytania zamiast je cofnąć.mysqli_free_result($wynik)
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ąć.