1

Temat: Jak wyłączyć AutoCommit w PostgreSQL-u?

2

Odp: Jak wyłączyć AutoCommit w PostgreSQL-u?

Wiatm raz jeszcze,  smile

zatem udało mi się znaleźć w końcu rozwiązanie - banalne w swej istocie smile

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 sad   ...jeśli istnieje taki sposób, proszę o podzielenie się ta informacją tutaj wink

Jak korzystać z dobrodziejstw PostgreSQL-a przy wyłączonej opcji AUTOCOMMIT ?  smile

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... sad


pozdrawiam smile

3

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?

4

Odp: Jak wyłączyć AutoCommit w PostgreSQL-u?

Hej, smile

przez weekend zrewidowałem swoje podejrzenia.
Co innego transakcje w samym okienku SQL-owym, a co innego transakcje w PlpgSQL-u sad
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..:)