W dniu 10.01.2012 18:30, pluton pisze:
1. Oczywiście, że może przerwać.
2. Twoje rozwiązanie jest niepotrzebne, bo wystarczy obydwa inserty dać w funkcji (*).
3. Działa to dlatego, że każde zapytanie, które nie jest w transakcji, jest automatycznie objęte transakcją, która jest
commitowana po jego zakończeniu.
4. Więc nie ominiesz problemu z długim commitem.
*
madej=> CREATE TABLE test (id integer);
CREATE TABLE
Czas: 2,573 ms
madej=> CREATE UNIQUE INDEX test_id_uniq on test (id);
CREATE INDEX
Czas: 3,512 ms
madej=> CREATE FUNCTION foo(a1 integer, a2 integer) returns bool AS
$f$
begin
insert into test values (a1);
insert into test values (a2);
return true;
end;
$f$
LANGUAGE 'plpgsql';
CREATE FUNCTION
Czas: 1,990 ms
madej=> SELECT foo(1,2);
foo
-----
t
(1 wiersz)
Czas: 2,523 ms
madej=> SELECT * from test ;
id
----
1
2
(2 wiersze)
Czas: 0,939 ms
madej=> SELECT foo(3,3);
BŁĄD: podwójna wartość klucza narusza ograniczenie unikalności "test_id_uniq"
SZCZEGÓŁY: Klucz (id)=(3) już istnieje.
KONTEKST: wyrażenie SQL "insert into test values (a2)"
PL/pgSQL function "foo" line 4 at wyrażenie SQL
madej=> SELECT * from test ;
id
----
1
2
(2 wiersze)
Czas: 0,817 ms
--
P.M.