commit within a procedure loop - cannot commite with subtransaction

Started by andyterryover 7 years ago5 messagesgeneral
Jump to latest
#1andyterry
andrew.terry@centremaps.co.uk

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

#2Adrian Klaver
adrian.klaver@aklaver.com
In reply to: andyterry (#1)
Re: commit within a procedure loop - cannot commite with subtransaction

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

#3Andrew Gierth
andrew@tao11.riddles.org.uk
In reply to: andyterry (#1)
Re: commit within a procedure loop - cannot commite with subtransaction

"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)

#4andyterry
andrew.terry@centremaps.co.uk
In reply to: Adrian Klaver (#2)
Re: commit within a procedure loop - cannot commite with subtransaction

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

#5andyterry
andrew.terry@centremaps.co.uk
In reply to: Andrew Gierth (#3)
Re: commit within a procedure loop - cannot commite with subtransaction

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