Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Kontrola transakcji
Jarod
post
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?


--------------------
”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335)
Go to the top of the page
+Quote Post
MMP
post
Post #2





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 2.06.2006

Ostrzeżenie: (0%)
-----


Zacznij używać PDO, ten obsługuje wyjątki. Więc wystarczy kod obrac w try { // zatwierdź } catch { // cofnij }
Go to the top of the page
+Quote Post
cicik
post
Post #3





Grupa: Zarejestrowani
Postów: 219
Pomógł: 5
Dołączył: 18.07.2006
Skąd: Piekary Śląskie

Ostrzeżenie: (0%)
-----


Ja mam bardzo sprawdzony sposób bawienia się transakcjami
na początku wykonujesz komendę SQL 'start transaction', na końcu dajesz 'commit'.

Wszystkie klasy abstrakcji dla baz danych mają to jakoś obudowane w metody np. $obiekt->begin() i $obiekt->commit(). Wszystko jednak sprowadza się do tego o czym pisałem na początku.


--------------------
CMS dla Twojej firmy
Wojciech Małota
Go to the top of the page
+Quote Post
SongoQ
post
Post #4





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.


--------------------
Go to the top of the page
+Quote Post
Jarod
post
Post #5





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

Ostrzeżenie: (0%)
-----


Cytat(SongoQ @ 14.02.2007, 05:58:37 ) *
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.

Wiem, że Myisam nie obsługuje trnsakcji. Używam innodb. Chyba z bazą jest coś nie tak. Bo na innej bazie ten kod działa prawidłowo.
Cytat(SongoQ @ 14.02.2007, 05:58:37 ) *
Transakcja to nezlalezny zbior operacji danego usera, nie ma na to wplywu co robi inny.

Jeśli skrypt przestanie działać z powodu błędu i nie zdąży wywołać ROLLBACK to baza i tak cofnie transakcje (tzn nie zatwierdzi jej). Zawsze tak sądziłem, więc to musi być inny problem. Jak napisałem wyżej najprawdopodoniej uszkodzona baza.
Cytat(SongoQ @ 14.02.2007, 05:58:37 ) *
(...)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.

Uważam, że nie do końca masz racje. Jeśli będę zliczał transakcje to pod koniec skryptu (w miejscu gdzie podejmowana jest decyzja czy zatwierdzić transakcje czy nie) mam tylko jeden komunikat "Udane.." / "Nieudane..." itp.

Twoim sposobem jest to troszkę bardziej skomplikowane. Poza tym jak chcesz sprawdzać czy zapytanie jest update zostało pomyślnie wykonane, jeśli:
Cytat
Podczas operacji UPDATE, MySQL nie aktualizuje kolumn w których nowa wartość jest identyczna z poprzednią

?


--------------------
”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335)
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Twoim sposobem jest to troszkę bardziej skomplikowane. Poza tym jak chcesz sprawdzać czy zapytanie jest update zostało pomyślnie wykonane, jeśli:
CYTAT

Podczas operacji UPDATE, MySQL nie aktualizuje kolumn w których nowa wartość jest identyczna z poprzednią

?

A wczym problem?
http://pl.php.net/manual/pl/function.mysql-query.php
Cytat
. Dla innych zapytań SQL mysql_query() zwraca TRUE lub FALSE informując czy zapytanie zakończyło się sukcesem czy też nie


Jak sie nie powiedzie to masz false i juz


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 08:54