transakcje w funkcji

Odpowiedz Nowy wątek
2011-10-18 18:21
0

Wyczytałem w necie, że postgresql nie wspiera transakcji zagnieżdżonych we funkcji, i po kilku próbach faktycznie nie wspiera. I teraz moje pytanie, jak się zabezpieczyć, żeby np. jeśli jeden update się z jakiegoś powodu nie wykona to, żeby ten drugi też się nie wykonał?

edytowany 1x, ostatnio: konrados, 2011-10-18 18:22

Pozostało 580 znaków

2011-10-18 18:32
0

chodzi Ci o stored proc? Jeśli tak to jak wysypie się insert to wysypie się cała procedura przecież i będziesz wiedział czy zakomitować czy cofnąć


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2011-10-18 18:55
0

Hmm... Nie wiem czy w postgresie to się nazywa stored proc :D w mysql na pewno

CREATE OR REPLACE FUNCTION public.test()
RETURNS integer AS
$body$
BEGIN

    UPDATE cos SET cos = 1 WHERE cos2 = 1;
    UPDATE cos2 SET cos = 1 WHERE cos2 = 1;
    RETURN 0;

END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER

i wywołanie

SELECT test();

i teraz jak się z jakiegoś powodu nie wykona pierwszy update to drugi się też nie wykona, ta? (2 dni w postgresie to nie wiem :D)

Pozostało 580 znaków

2011-10-18 19:58
0

tak, ale nic nie stoi na przeszkodzie, żeby wykonał się pierwszy a drugi nie


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2011-10-18 20:35
0

Da się zrobić, żeby jeśli się drugi nie wykona to pierwszy się cofnie?

Pozostało 580 znaków

2011-10-18 21:58
0

jak gdzieś wpiszesz SELECT test(); i potem to uruchomisz to będziesz widział czy się wykonało czy był błąd. Na tej podstawie albo zatwierdzisz albo cofniesz. Każda zmiana w bazie jest objęta transakcją, z tym że transakcja może być rozpoczęta niejawnie ale zakończona (commit/roolback) musi być jawnie przez usera. Jaśniej nie potrafię.


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2011-10-18 22:47
0

Nie dokońca zrozumiałem kiedy się zaczyna ta niejawna transakcja. Więc w php w ciągu jednej sesji odpale sobie to "SELECT test();" i sprawdze czy nie było błędu, jak był błąd to robię "ROLLBACK;", czy mam przed odpaleniem test() rozpacząc jawna transakcje?

Pozostało 580 znaków

2011-10-19 00:27
0

Nie pamiętam czy transakcja jest rozpoczynana zaraz po połączeniu czy dopiero po pierwszej operacji DML. W każdym bądź razie jak zrobisz commit/rollback to jest kończona bieżąca i rozpoczynana nowa albo od razu albo po operacji DML i tak aż do końca trwania połączenia. Jest to niejako transakcja domyślna. Możesz w każdej chwili rozpocząć jawnie nową transakcję a następnie ją zakończyć. Nie potrafię tego jaśniej wytłumaczyć.

Co do jawnego rozpoczynani i kończenia transakcji jest to o wiele czytelniejsze i jasno "daje do zrozumienia", że dany kawałek albo się zapisuje cały albo w ogóle


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2011-10-19 11:03
0

Funkcja w PostgreSQL jest sama w sobie transakcją, tzn. jeżeli nie wykona się część funkcji to nie wykona się cała funkcja. PostgreSQL nie wspiera transakcji zagnieżdżonych, więc nie można dodatkowo umieścić transakcji w funkcji, która już jest transakcją.

edytowany 1x, ostatnio: AdamPL, 2011-10-19 11:03

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0