![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
Wszyscy wiemy do czego służą transakcje. Zastanawiam się w jaki sposób kontrolujecie ich poprawność w swoich projektach.
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. 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? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Przyjaciele php.pl Postów: 2 923 Pomógł: 9 Dołączył: 25.10.2004 Skąd: Rzeszów - studia / Warszawa - praca Ostrzeżenie: (0%) ![]() ![]() |
@MMP Czy PDO czy jeszcze zupelnie cos dziwnego nie ma roznicy transakcja to transakcja.
@J4r0d Cytat O dziwo pierwsza transakcja została zatwierdzona (szok bo tak nie powinno się stać). No to masz blad w kodzie. W przypadku niepowodzenia transakcji i zamkniecia skryptu transakcja jest wycofana. Podejrzewam ze uzywasz MySQL z MyISAM jesli tak to nie ma mowy o jakiej kolwiek transakcji bo czegos takiego niestety tam nie ma. Transakcja to nezlalezny zbior operacji danego usera, nie ma na to wplywu co robi inny. Odnosnie obslugi jesli masz do dyspozycji rzucenie wyjatku to to robisz a jesli nie to w metodzie exekucji zapytania sprawdzasz poprawnosc wykonania, jesli wystapil blad wycofujesz a jesli nie to idziesz dalej. Pisales ze liczysz sobie wykonania transakcji hm po co? Wystarczy sprawdzac poprawnosc wykonania. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 11.10.2025 - 14:41 |