Обсуждение: Transaction control in a C language function
Hello all,
I would like to implement transaction control in a function implemented in C language. Currently I'm using SPI to do the job.
When calling SPI_commit() it returns this error message:
SQL Error [XX000]: ERROR: portal snapshots (0) did not account for all active snapshots (1)
Below, there is an example.
PG_FUNCTION_INFO_V1(my_commit);
Datum my_commit(PG_FUNCTION_ARGS)
{
SPIExecuteOptions execopts;
SPI_connect_ext(SPI_OPT_NONATOMIC);
memset(&execopts, 0, sizeof(execopts));
execopts.params = NULL;
execopts.read_only = false;
execopts.allow_nonatomic = true;
execopts.must_return_tuples = false;
execopts.tcount = 0;
execopts.dest = NULL;
execopts.owner = NULL;
/* Execute some SQL commands */
SPI_execute_extended("UPDATE mytable SET name = 'done'", &execopts);
/* Commit the transaction */
SPI_commit();
SPI_finish();
PG_RETURN_NULL();
}
Thanks in advance,
Flaris Feller
Flaris Feller <flaris.feller@gmail.com> writes: > I would like to implement transaction control in a function implemented in > C language. That will certainly not work unless you make it a procedure. It'd be a good idea also to check that the CALL came from a non-atomic context. regards, tom lane
Hello Tom,
You are absolutely right, I was calling it from a function instead of a procedure.
The documentation should mention that.
Thanks for your clarification.
Regards,
Flaris.
Em seg., 6 de mar. de 2023 às 12:21, Tom Lane <tgl@sss.pgh.pa.us> escreveu:
Flaris Feller <flaris.feller@gmail.com> writes:
> I would like to implement transaction control in a function implemented in
> C language.
That will certainly not work unless you make it a procedure.
It'd be a good idea also to check that the CALL came from a
non-atomic context.
regards, tom lane
--
Flaris Roland Feller