2013-04-04 18 views
7

ta powinna być łatwa do tych znanych z PostgreSQL:przywracania po błędzie w transakcji

Moja aplikacja wydaje begin_work, czy szereg operacji, a następnie wystawia commit. Operacje i zatwierdzenia są pakowane wewnątrz bloku try-catch, którego instrukcja catch wykonuje rollback. Założenie: jeśli wystąpi błąd podczas operacji SQL, Postgresql automatycznie wycofa transakcję, a zatem moje wycofanie stanie się zbędne , ale nieszkodliwe. Czy to założenie jest poprawne?

(Powodem, dla którego jestem rollbacking anyway. Tylko w przypadku wyjątek niezwiązane z ocurs operacji SQL)

Odpowiedz

4

W przypadku wystąpienia błędu, PostgreSQL faktycznie nie wycofać się z transakcji. Niepowodzenie każdego kolejnego stwierdzenia z błędem. Możesz wypróbować to w kliencie.

Musisz wykonać operację wycofywania, zanim jakiekolwiek instrukcje zostaną pomyślnie wykonane.

Jeśli zamkniesz połączenie i rozpoczniesz nowe, nie ma to większego znaczenia. Jeśli jednak zachowujesz połączenie i uruchamiasz inne instrukcje, które spodziewasz się pomyślnie, to nie zadziała.

+0

Wygląda na to, że moje założenie było błędne, ale i tak miałem rację. Dzięki! –

+2

@JonSmark Prawidłowe. Pg oznacza, że ​​transakcja została przerwana, ale nie powraca do trybu automatycznego zatwierdzania ani nie otwiera nowej transakcji do czasu wycofania. Powodem tego jest to, że w przeciwnym razie możesz mieć nieprzyjemne sytuacje, takie jak 'INSERT INTO do historytable SELECT * FROM maintable;' niepowodzenie, następnie następujące 'TRUNCATE TABLE maintable' powodzenie. Oooo! –

Powiązane problemy