Temat: posgtres transakcje
Piotr P.:
Łukasz Bandzarewicz:
Piotr P.:
W pętli foreach złapany jest wyjątek który kończy działanie skryptu.
??
Jeśli wyjątek nie zostanie wyrzucony dalej, to skrypt nie zostanie zakończony. Skrypt zostanie zakończony tylko wtedy, jeśli wyjątek nie zostanie przechwycony.. no chyba, że jest jakaś magia php, o której nie wiem ;)
Źle się wyraziłem :) Tak skrypt zostanie bezwarunkowo zakończony jeśli nie przechwycisz wyjątku, w innym (w tym) przypadku złapanie wyjątku zakończy pętle foreach tak samo jak break, więc następne kwerendy nie zostaną wysłane do bazy.
Tu też się nie zgodzę..
W moim przypadku wyjątek jest łapany, obsługiwany i nie jest wyrzucany dalej, więc nic nie ma prawa przerwać pętli.
Poza tym tablica $errors jest wypełniania błędami do ostatniego rekordu w pętli.
Z problemem już sobie poradziłem, tak jak ktoś mi doradził - sprawdzam najpierw czy rekord o danym ID istnieje.
Poświęciłem chwilę na znalezienie przyczyny i dogrzebałem się do kilku ciekawych informacji - postgresa można skonfigurować tak, aby wszystkie zapytania w danym połączeniu uruchamiane były w transakcji (opcja autocommit), niestety nie doszedłem jeszcze do tego jak tę opcję wyłączyć i czy jest włączana domyślnie. Zapytanie SET AUTOCOMMIT = 'off' niestety rzuca mi wyjątek 'deprecated' - czyli moja wersja postgresa już tego nie obsługuje.
Czy ktoś już może posiadł wiedzę tajemną na temat AUTOCOMMIT w postgresie i byłby chętny się nią podzielić? ;)
Prawdopodobnie może to być też wina phpDoctrine, który też w jakiś magiczny sposób uruchamia transakcje.
Nieco z innej beczki:
Zauważyłem bardzo dziwną rzecz - jeśli jakieś zapytanie do postgresa spowoduje błąd, to w wyjątku php (PDO) wyświetlony zostanie fragment zapytania, które wykonywane jest zaraz po błędnym zapytaniu (że niby to ono powoduje błąd).. dziwne, prawda?