Załóżmy, że dokonuję w bazie (za pomocą skryptu oczywiście) 2 delete, 4 inserty i 2 update'y. Albo wszystkie muszą zostać wykonane poprawnie albo nic nie jest zmieniane w bazie. Ja do tej pory robiłem tak, że:
1. startowałem transakce
2. ustawiałem $transakcja =0;
3. po każdym zapytaniu $transakcja++;
4. Jeśli $transakcja ==8 (wym przypadku) COMMIT else ROLBACK.
Ale dzisiaj znalazłem pewien błąd. Aplikacja wystartowała aplikacje, 4 zapytania zostały wykonane a przy 5 był jakiś błąd. Skrypt wywalił "Nieudane zapytani..." i zatrzymał wykonywanie skryptu. Inny użytkownik wykonywał inną operacje, która też korzysta z transakcji, ta operacja została wykonana pomyślnie.. O dziwo pierwsza transakcja została zatwierdzona (szok bo tak nie powinno się stać). Czyli zamiast 2 deletów, 4 insertów i 2 updatów zostało wykonane 4 pierwsze po czym zatwierdzone. ucierpiała integralność danych.
Mógłym stosować tai zapis (odnośnie punktu 2.) if (mysql_affected_rows() > 0) $transakcja++;
ale jak pisze w manualu:
Cytat
mysql_affected_rows() zwraca ilość wierszy przetworzonych w ostatniej operacji INSERT, UPDATE lub DELETE
(...)
Notatka: Podczas operacji UPDATE, MySQL nie aktualizuje kolumn w których nowa wartość jest identyczna z poprzednią. Możliwe jest zatem, że zwrócona przez mysql_affected_rows() liczba nie będzie odpowiadać liczbie wierszy pasujących do zapytania, ale tych, które zostały faktycznie zmienione.
(...)
Notatka: Podczas operacji UPDATE, MySQL nie aktualizuje kolumn w których nowa wartość jest identyczna z poprzednią. Możliwe jest zatem, że zwrócona przez mysql_affected_rows() liczba nie będzie odpowiadać liczbie wierszy pasujących do zapytania, ale tych, które zostały faktycznie zmienione.
Wystarczy, że updatujemy dane, które nie zostały zmienione i już lipa, transakcja nie zostanie zatwierdzona.
Może macie jakieś sprawdzone sposoby kontroli transakcji?