<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Forum PostgreSQL - Jak wyłączyć AutoCommit w PostgreSQL-u?]]></title>
		<link>https://forum.postgresql.org.pl/viewtopic.php?id=65</link>
		<description><![CDATA[Najświeższe odpowiedzi w Jak wyłączyć AutoCommit w PostgreSQL-u?.]]></description>
		<lastBuildDate>Mon, 11 Aug 2008 08:02:12 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Odp: Jak wyłączyć AutoCommit w PostgreSQL-u?]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=226#p226</link>
			<description><![CDATA[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..:)]]></description>
			<author><![CDATA[dummy@example.com (trick487)]]></author>
			<pubDate>Mon, 11 Aug 2008 08:02:12 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=226#p226</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Jak wyłączyć AutoCommit w PostgreSQL-u?]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=225#p225</link>
			<description><![CDATA[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?]]></description>
			<author><![CDATA[dummy@example.com (rski)]]></author>
			<pubDate>Sun, 10 Aug 2008 17:17:08 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=225#p225</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Jak wyłączyć AutoCommit w PostgreSQL-u?]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=222#p222</link>
			<description><![CDATA[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 :)]]></description>
			<author><![CDATA[dummy@example.com (trick487)]]></author>
			<pubDate>Thu, 07 Aug 2008 12:03:11 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=222#p222</guid>
		</item>
		<item>
			<title><![CDATA[Jak wyłączyć AutoCommit w PostgreSQL-u?]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=221#p221</link>
			<description><![CDATA[Witam, :)

siedzę już któryś dzień przeglądając net i e-book-i help-y itp. Chcę wyłączyć AutoCommit, a opisany sposób nie działa lub inaczej rozumiem jego działanie niż PostgreSQL. 

Co chcę uzyskać?

Łączę się do PostgreSQL-a uruchamiając dwa pgAdmin III i podłączam się do bazy - czyli tworzę dwie niezależne "sesje". Z każdego pgAdmin III odpalam SQL editor-ka. W jednym z nich wpisuję insert do tabelki, wykonuję go, ale nie commit-uję. W drugim okienku SQL-editor-ka po odpaleniu select-a na tej tabelce widzę już ten rekord, a chciałbym, by go nie było widać do momentu za-commit-owania tego insert-a w pierwszym okienku.

...TAK, tak wiem, że default-owo jest włączony AUTOCOMMIT i że to normalne działanie...
Znalazłem opis, z którego wynikało, że dla wyłączenia AUTOCOMMIT-a wystarczy zmienić opcję AUTOCOMMIT w psql-u dla tej bazy, co też zrobiłem: \set AUTOCOMMIT off
i wykonałem wyżej opisane kroki z odpalaniem dwóch niezależnych podłączeń za pomocą pgAdmin III i tego opisanego insert-a i select-a. Niestety nie zadziałało :(

Znalazłem również opis, z któego wynikało, że należy umieścić takie polecenie w pliku psqlrc.conf - plik ten jest zaczytywany przy starcie bazy. Tak też uczyniłem. po zalogowaniu się przez psql-a i wydaniu polecenia \set rzeczywiście widzałem -> AUTOCOMMIT = 'off' niestety opisane sprawdzenie z odpalaniem dwóch niezależnych podłączeń za pomocą pgAdmin III i tego opisanego insert-a i select-a  niestety nie zadziałało :(

Czy ktoś może pomóc mi w wyłączeniu autocommit-a, by zachowywało się to podobnie jak w przypadku ORACLE'a ?

Dodatkowe Info:
Baza PostgreSQL 8.3
System Win XP
lokalizacja pliczku psqlrc.conf z konfiguracją w C:\Documents and Settings\[NAZWA_KONTA_UZYTKOWNIKA]\Dane aplikacji\postgresql

będę wdzięczny za info z rozwiązaniem problemu lub ze stwierdzeniem, że tego na PostgreSQL nie da się zrobić (nie będe wtedy szukał pomocy)

pozdrawiam :)]]></description>
			<author><![CDATA[dummy@example.com (trick487)]]></author>
			<pubDate>Thu, 07 Aug 2008 08:07:14 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=221#p221</guid>
		</item>
	</channel>
</rss>
