![]() |
![]() ![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 20 Pomógł: 0 Dołączył: 11.01.2004 Skąd: Lublin Ostrzeżenie: (0%) ![]() ![]() |
Jest jakakolwiek możliwość, zby wykonało się 1 zapytanie, a drugie nie? (zakładając, że dane w zmiennych są poprawne)
Ponieważ raz na jakiś czas dodaje mi transakcję (insert into transaction_pay...), ale już nie aktualizuje ilości towarów (update transactions ...) Wspomnę tylko, że ten kawałek kodu jest dość często uruchamiany (cronem co 3minuty a następnie w pętli po kilkaset razy). Gdzie szukać problemu? -------------------- 8cells.com - tworzenie stron www
|
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 2 958 Pomógł: 574 Dołączył: 23.09.2008 Skąd: wiesz, że tu jestem? Ostrzeżenie: (0%) ![]() ![]() |
try/catch + logowanie błędów i wszystko będzie jasne.
ps. po co ci dwa rolback'i? |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 872 Pomógł: 94 Dołączył: 31.03.2010 Ostrzeżenie: (0%) ![]() ![]() |
Na jakim silniku sa tabele w bazie? Transakcje nie dzialaja na MyISAM.
btw. Twoj kod jest kompletnie bez sensu, po co tworzyc transakcje dla 1 zapytania? Ten post edytował lukaskolista 27.09.2012, 08:31:03 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 20 Pomógł: 0 Dołączył: 11.01.2004 Skąd: Lublin Ostrzeżenie: (0%) ![]() ![]() |
Cytat ps. po co ci dwa rolback'i? Bo jeśli jedno zapytanie się nie uda to -> cofam. Jeśli jedno się uda a drugie nie, też -> cofam (drugim rollback). Nie tak powinno się to robić? Cytat Na jakim silniku sa tabele w bazie? Transakcje nie dzialaja na MyISAM. Są na InnoDB Cytat btw. Twoj kod jest kompletnie bez sensu, po co tworzyc transakcje dla 1 zapytania? Jakiego jednego? Są dwa: INSERT i UPDATE. Nie powinno zrobić UPDATE, jeśli nie zrobi INSERT i na odwrót. W takim razie jak to inaczej napisać? Ten post edytował jakal 27.09.2012, 11:15:39 -------------------- 8cells.com - tworzenie stron www
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 6 380 Pomógł: 1116 Dołączył: 30.08.2006 Ostrzeżenie: (0%) ![]() ![]() |
Przejść na PDO i
-------------------- |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 2 707 Pomógł: 290 Dołączył: 16.12.2008 Skąd: Śląsk Ostrzeżenie: (0%) ![]() ![]() |
Tak się zastanawiam czy po prostu nie możesz sprawdzić czy zapytanie się wykonało i jeśli tak to wykonujesz drugie?
Transakcje wydawało mi się, że służą troszkę bardziej rozbudowanym celom - np. dodawanie tysiąca rekordów - jeden się nie doda to cofasz i naprawiasz. -------------------- |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 20 Pomógł: 0 Dołączył: 11.01.2004 Skąd: Lublin Ostrzeżenie: (0%) ![]() ![]() |
Tak się zastanawiam czy po prostu nie możesz sprawdzić czy zapytanie się wykonało i jeśli tak to wykonujesz drugie? Tak robiłem do tej pory, ale czasami zdarzało się, że dodawało do 1 tabeli, ale nie aktualizowało w 2 tabeli. Dlatego pomyślałem o transakcjach. Mam jeszcze jeden pomysł. Bo ten kod jest uruchamiany w cronie i bardzo często używany (setki razy wykonywany co kilka minut). Na drugiej tabeli jest wykonywanych znacznie więcej operacji, również przez inny cron. Może po prostu jest natłok operacji na danej bazie i czasami operacje nie są wykonywana? Jest na to jakaś metoda? Czy blokowanie tablic jest odpowiednie? (nie chciałbym zeby reszta zapytań w tym czasie jak wykonuje jedno to się nie wykonywała lub zwracała błąd, tylko oczekiwała na swoją kolej) -------------------- 8cells.com - tworzenie stron www
|
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
@lukaskolista, @markonix: Każda seria zapytań (włączając w to pojedyncze zapytania) musi być objęta transakcją. W przypadku pojedynczych zapytań można sobie co najwyżej darować jawne deklarowanie transakcji, bo domyślnie włączony jest autocommit.
@jakal: Przede wszystkim przydała by się informacja o wystąpieniu błędu. Poza rollbackiem mógłbyś też zapisywać informację o przyczynie niepowodzenia operacji - ułatwiłoby to Ci pracę. Dodatkowo, nie muszę chyba wspominać o tym, że użycie PDO znacznie uprościłoby kod. Cytat Na drugiej tabeli jest wykonywanych znacznie więcej operacji, również przez inny cron. Jakiego typu są to operacje? Mogą one nie mieć kompletnie żadnego znaczenia, być może wystarczy jedynie zwiększyć poziom izolacji transakcji, a być może rzeczywiście trzeba będzie blokować całą tabelę.EDIT: Sam kod, mimo iż tragicznej jakości, wydaje się być w porządku. Problem jest prawdopodobnie gdzie indziej. Ten post edytował Crozin 27.09.2012, 13:49:22 |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 20 Pomógł: 0 Dołączył: 11.01.2004 Skąd: Lublin Ostrzeżenie: (0%) ![]() ![]() |
Cytat @jakal: Przede wszystkim przydała by się informacja o wystąpieniu błędu. Poza rollbackiem mógłbyś też zapisywać informację o przyczynie niepowodzenia operacji - ułatwiłoby to Ci pracę. Dodatkowo, nie muszę chyba wspominać o tym, że użycie PDO znacznie uprościłoby kod. Tak chyba zrobię, jeśli drugie zapytanie się nie wykona to zapiszę czemu, razem z treścią zapytania. Wiem, że PDO by ułatwiło, ale aplikacja ma za dużo kodu, żeby teraz zmieniać wszytko na PDO. Cytat Jakiego typu są to operacje? W większości SELECT, ale też często UPDATE. Cytat EDIT: Sam kod, mimo iż tragicznej jakości Czemu tragiczna jakość? ![]() -------------------- 8cells.com - tworzenie stron www
|
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Cytat Tak chyba zrobię, jeśli drugie zapytanie się nie wykona to zapiszę czemu, razem z treścią zapytania. Powinieneś zapisywać informację o wystąpieniu dowolnego, nawet nieistotnego błędu i najlepiej od razu przerywać działanie całej aplikacji w przypadku jego wystąpienia. Kod, który generuje nieobsłużone błędy właściwie z definicji działa w sposób nieokreślony.Wiem, że PDO by ułatwiło, ale aplikacja ma za dużo kodu, żeby teraz zmieniać wszytko na PDO. Cytat W większości SELECT, ale też często UPDATE. Nie da się teraz stwierdzić czy te zapytania mają w ogóle jakikolwiek związek z problemem, ale być może zapytania SELECT operują na innym niż przewidywanym zestawie rekordów - skutek modyfikowania tabeli przez inny proces. Poczytaj o wspomnianych wcześniej poziomach izolacji transakcji, to będziesz wstanie stwierdzić czy to może powodować błąd.Cytat Czemu tragiczna jakość? Po prostu czysty PHP + MYSQL, nie obiektowy. Brak obsługi błędów, nie korzystanie z preparowanych zapytań w momencie gdy to samo zapytanie jest wykonywane setki razy z rzędu, brak odpowiedniego przygotowania danych do wrzucenia w treść zapytania SQL, niepotrzebnie wiele poziomów zagłębienia kodu, niepotrzebne powtarzanie fragmentów kodu, nieczytelne nazwy zmiennych/formatowanie kodu... to tak na pierwszy rzut oka.
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 11:34 |