Thread: Isolation and Concurrency in PG functions?

Isolation and Concurrency in PG functions?

From
Roberto Mello
Date:
Hail PG Gurus,

Can somebody please tell us about concurrency in PG functions? 

I am porting some VERY big functions to PG for a data warehousing system
(that is GPL'd BTW) and it seems that the results of one portion of the
function (e.g. a create table or a series of inserts) are invisible to
the other parts which obviously causes the function (and following
functions) to fail and is completely driving me nuts because I see the
results when I do the queries interactively.

What can I do about this? Is autocommit off in functions? How can I
bring it on? This becomes worse because transactions are not supported
in functions (anybody knows when will this be around?).

Thanks,

-Roberto Mello

-- 
Roberto Mello, rmello@cc.usu.edu - GNU/Linux Reg.User #96240 Computer Science - Utah State UniversityUSU Free Software
andGNU/Linux Club, Presidenthttp://fslc.usu.edu - http://www.brasileiro.net/roberto
 


Re: Isolation and Concurrency in PG functions?

From
Tom Lane
Date:
Roberto Mello <rmello@cc.usu.edu> writes:
> I am porting some VERY big functions to PG for a data warehousing system
> (that is GPL'd BTW) and it seems that the results of one portion of the
> function (e.g. a create table or a series of inserts) are invisible to
> the other parts which obviously causes the function (and following
> functions) to fail and is completely driving me nuts because I see the
> results when I do the queries interactively.

?? How are you defining these functions, exactly?  In SQL or PLPGSQL
functions, successive queries certainly do see each others' results,
for example

regression=# create table foot (f1 int);
CREATE
regression=# create function foo(int) returns int as
regression-# 'insert into foot values($1);
regression'# select count(*) from foot' language 'sql';
CREATE
regression=# select foo(1);foo
-----  1
(1 row)

regression=# select foo(1);foo
-----  2
(1 row)

If you are coding at the C level you may need to call
CommandCounterIncrement() between queries.
        regards, tom lane