Thread: commit within a procedure loop - cannot commite with subtransaction

commit within a procedure loop - cannot commite with subtransaction

From
andyterry
Date:
Hi,

Using a procedure for the first time to run some processing for each row in
a table, generating output to a target table. The following works without
COMMIT the example below gives:

INFO: Error Name:cannot commit while a subtransaction is active
INFO: Error State:2D000

Could someone point me in the right direction so i can understand why and
how i might rework my methodology?


CREATE OR REPLACE PROCEDURE my_functions.first_procedure(
    )
LANGUAGE 'plpgsql'

AS $BODY$

DECLARE

grd_geom geometry(Polygon,27700);
grd_gid integer;
rec data.areas%rowtype;

BEGIN

DELETE FROM data.output;
DELETE FROM data.temp_output;

FOR rec IN SELECT * FROM data.areas
    LOOP
        grd_geom := rec.geom;
        grd_gid := rec.gid;

        PERFORM my_functions.processing_function(grd_geom);
        DELETE FROM data.temp_output;
        COMMIT;
    END LOOP;
RETURN;
                                             

END;

$BODY$;

GRANT EXECUTE ON PROCEDURE my_functions.first_procedure() TO postgres;
GRANT EXECUTE ON PROCEDURE my_functions.first_procedure() TO PUBLIC;

Thanks

Andy



--
Sent from: http://www.postgresql-archive.org/PostgreSQL-general-f1843780.html


Re: commit within a procedure loop - cannot commite withsubtransaction

From
Adrian Klaver
Date:
On 1/21/19 4:43 AM, andyterry wrote:
> Hi,
> 
> Using a procedure for the first time to run some processing for each row in
> a table, generating output to a target table. The following works without
> COMMIT the example below gives:
> 
> INFO: Error Name:cannot commit while a subtransaction is active
> INFO: Error State:2D000
> 
> Could someone point me in the right direction so i can understand why and
> how i might rework my methodology?

1) This is Postgres 11, correct?

2) I have to believe the issue is the:

PERFORM my_functions.processing_function(grd_geom);

https://www.postgresql.org/docs/11/plpgsql-transactions.html
"...But if the call stack is CALL proc1() → SELECT func2() → CALL 
proc3(), then the last procedure cannot do transaction control, because 
of the SELECT in between."

3) What is my_functions.processing_function() doing?

> 
> 
> CREATE OR REPLACE PROCEDURE my_functions.first_procedure(
>     )
> LANGUAGE 'plpgsql'
> 
> AS $BODY$
> 
> DECLARE
> 
> grd_geom geometry(Polygon,27700);
> grd_gid integer;
> rec data.areas%rowtype;
> 
> BEGIN
> 
> DELETE FROM data.output;
> DELETE FROM data.temp_output;
> 
> FOR rec IN SELECT * FROM data.areas
>     LOOP
>         grd_geom := rec.geom;
>         grd_gid := rec.gid;
> 
>         PERFORM my_functions.processing_function(grd_geom);
>         DELETE FROM data.temp_output;
>         COMMIT;
>     END LOOP;
> RETURN;
>                                             
> 
> END;
> 
> $BODY$;
> 
> GRANT EXECUTE ON PROCEDURE my_functions.first_procedure() TO postgres;
> GRANT EXECUTE ON PROCEDURE my_functions.first_procedure() TO PUBLIC;
> 
> Thanks
> 
> Andy
> 
> 
> 
> --
> Sent from: http://www.postgresql-archive.org/PostgreSQL-general-f1843780.html
> 
> 


-- 
Adrian Klaver
adrian.klaver@aklaver.com


Re: commit within a procedure loop - cannot commite with subtransaction

From
Andrew Gierth
Date:
>>>>> "andyterry" == andyterry  <andrew.terry@centremaps.co.uk> writes:

 andyterry> Hi,

 andyterry> Using a procedure for the first time to run some processing
 andyterry> for each row in a table, generating output to a target
 andyterry> table. The following works without COMMIT the example below
 andyterry> gives:

 andyterry> INFO: Error Name:cannot commit while a subtransaction is active
 andyterry> INFO: Error State:2D000

What client are you using to execute this? Some clients may insert
SAVEPOINT statements (which create subtransactions) behind your back
(e.g. psql with \set ON_ERROR_ROLLBACK does this) in order to recover
from errors without aborting the whole transaction.

(turn on log_statement=all in your config, or for the user you're
executing this as, and look for the command in the server log)

-- 
Andrew (irc:RhodiumToad)


Re: commit within a procedure loop - cannot commite withsubtransaction

From
andyterry
Date:
Thanks Adrian,

It is PostgreSQL 11.
The procedure listed is calling one postgres function which is in turn
calling another postgres function but no additional procedure, just
functions.
It's a bit lengthy to explain what the functions are doing so i'll try
testing with a less complex task i think so i can narrow things down.

Appreciate your response

Andy




--
Sent from: http://www.postgresql-archive.org/PostgreSQL-general-f1843780.html


Re: commit within a procedure loop - cannot commite withsubtransaction

From
andyterry
Date:
Thanks Andrew,

The database is currently chewing through the load (without commits) as i'm
doing a batch of rows at a time.

I'm calling the procedure in pgadmin (4-4.2) as i was testing some bits from
there but i'll also try a psql run

Appreciate the pointers, Andy



--
Sent from: http://www.postgresql-archive.org/PostgreSQL-general-f1843780.html