<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Forum PostgreSQL - Jak wyłączyć AutoCommit w PostgreSQL-u?]]></title>
	<link rel="self" href="http://forum.postgresql.org.pl/extern.php?action=feed&amp;tid=65&amp;type=atom"/>
	<updated>2008-08-11T08:02:12Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.postgresql.org.pl/viewtopic.php?id=65</id>
		<entry>
			<title type="html"><![CDATA[Odp: Jak wyłączyć AutoCommit w PostgreSQL-u?]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=226#p226"/>
			<content type="html"><![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..:)]]></content>
			<author>
				<name><![CDATA[trick487]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=200</uri>
			</author>
			<updated>2008-08-11T08:02:12Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=226#p226</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Jak wyłączyć AutoCommit w PostgreSQL-u?]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=225#p225"/>
			<content type="html"><![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?]]></content>
			<author>
				<name><![CDATA[rski]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=26</uri>
			</author>
			<updated>2008-08-10T17:17:08Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=225#p225</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Jak wyłączyć AutoCommit w PostgreSQL-u?]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=222#p222"/>
			<content type="html"><![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 :)]]></content>
			<author>
				<name><![CDATA[trick487]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=200</uri>
			</author>
			<updated>2008-08-07T12:03:11Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=222#p222</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Jak wyłączyć AutoCommit w PostgreSQL-u?]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=221#p221"/>
			<content type="html"><![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 :)]]></content>
			<author>
				<name><![CDATA[trick487]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=200</uri>
			</author>
			<updated>2008-08-07T08:07:14Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=221#p221</id>
		</entry>
</feed>
