Odp: Jak wyłączyć AutoCommit w PostgreSQL-u?
Wiatm raz jeszcze,
zatem udało mi się znaleźć w końcu rozwiązanie - banalne w swej istocie
Niestety samo wyłączenie AUTOCOMMIT w psql -> \set AUTOCOMMIT off nie powoduje, że dowolna instrukacja SQL-owa rozpoczyna transakcję, tak jak to się dzieje w ORACLE-u. Trochę to smutne ...jeśli istnieje taki sposób, proszę o podzielenie się ta informacją tutaj
Jak korzystać z dobrodziejstw PostgreSQL-a przy wyłączonej opcji AUTOCOMMIT ?
By wyłączyć AUTOCOMMIT należy:
1) ustawić w psql dla danej bazy \set AUTOCOMMIT off
2) w ramach wykonywania instrukcji SQL-owych PLpgSQL-owych na samym początku dodać instrukcję -> BEGIN TRANSACTION; AUTOCOMMIT jest wyłączony do momentu wydania polecenia COMMIT; lub ROLLBACK; Po tych poleceniach by dalej był wyłączony należy znów wydać polecenie BEGIN TRANSACTION; Polecenia COMMIT i ROLLBACK kończą transakcję, więc nalezy rozpocząć kolejną.
Szkoda, że w manualu nie znalazłem opisu tej prostej, banalnej mozliwości..., szkoda, że jej tam nie było...
pozdrawiam
Odp: Jak wyłączyć AutoCommit w PostgreSQL-u?
moze sie myle ale wcale nie trzeba wylaczac autocommit aby korzystac z dobrodziejstw transakcji, BEGIN i COMMIT/ROLLBACK tworza bloki transakcji i zadne z polecen w srodku transakcji nie jest zatwierdzanie dopoki nie wydamy polecenia commit. wiec nie wiem po co wylaczac autocommit? czegos nie zrozumialem?
Odp: Jak wyłączyć AutoCommit w PostgreSQL-u?
Hej,
przez weekend zrewidowałem swoje podejrzenia.
Co innego transakcje w samym okienku SQL-owym, a co innego transakcje w PlpgSQL-u
W obu przypadkach nie trzeba wyłączać autocommit - tu myliłem się niestety:(
W okienku SQL-a wystarczy wpisać BEGIN TRANSACTION; i już mamy rozpoczętą transakcję, którą zakończymy COMMIT lub ROLLBACK.
W PLpgSQL-u tak, jak napisał RSKI samo rozpoczęcie działania funkcji jest transakcją, która kończy się albo COMMIT albo ROLLBACK.
Zastanawiam się, czy gdyby udało się wyłączyć AUTOCOMMIT-a, czy możnaby użyć w funkcji instrukcji COMMIT lub ROLLBACK w sposób jawny, a nie domyślny.
Pytanie do bardziej doświadczonych w pisaniu PLpgSQL-u:
Jeśli funkcja rozpoczyna niejawnie transakcję i kończy ją COMMIT-em lub ROLLBACK-iem to jak rozumieć zakończenie poprawne wywołanej funkcji w funkcji - czy działanie wywołanej funkcji jest już za-COMMIT-owane, bez względu czy funkcja, która wywołała tą funkcję zakończy się poprawnie, czy niepoprawnie (ROLLBACK-iem) ?
Przykład: (taki od czapy)
funkcja f1 wstawia do tabelki T_A wiersz z wartoscią 'A'.
funkcja f2 wywołuje funkcję f1, a potem wstawia do tabelki T_B wiersz z wartoscią 'B'.
Wywołujemy f2
Załóżmy, że f1 wywołane w trakcie wykonywania f2 zakonczylo sie poprawnie
Załóżmy, że z jakiś powodów wstawienie wiersza do T_B z wartością 'B' się nie powiodło (np. naruszenie więzów integralności), czyli f2 kończy się ROLLBACK-iem
Co otrzymujemy na końcu?
Dla mnie naturalnym byłoby, gdyby ROLLBACK dotyczył zarówno f2 jak i wykonywanej w jej ramach f1, czyli nic na bazie nie powinno się zmienić - jedna transakcja w ramach której wykonywała się f2 i f1.
A jak jest w rzeczywistości? Może jest tak, że skutki f1 zostały wprowadzane na bazę i zatwierdzone, a f2 nie wykonała wstawienia - przy odpaleniu kolejnych funkcji osobne transakcje?
pozdrawiam..:)