I have situation in which I have to commit a portion of code as transaction of its own.
I have created a table subtransaction_tbl
:
CREATE TABLE subtransaction_tbl
(
entryval integer
)
And a function in language plpython3u:
CREATE FUNCTION subtransaction_nested_test_t() RETURNS void
AS $$
plpy.execute("INSERT INTO subtransaction_tbl VALUES (1)")
with plpy.subtransaction():
plpy.execute("INSERT INTO subtransaction_tbl VALUES (2)")
$$ LANGUAGE plpython3u;
First situation:
BEGIN TRANSACTION;
INSERT INTO subtransaction_tbl VALUES (4);
select subtransaction_nested_test_t();
COMMIT TRANSACTION;
Entries in table are correct: 1,2,4
Second situation:
BEGIN TRANSACTION;
INSERT INTO subtransaction_tbl VALUES (4);
select subtransaction_nested_test_t();
ROLLBACK TRANSACTION;
Values in the table are not populated
I expected 1
or 2
should be added to table subtransaction_tbl
but to my surprise no value was inserted. I imagined a new subtransaction was opened by the function and it should not depend upon the parent transaction. Please let me know if I am right or not.
Are there autonomous transactions in Postgres? Or do I have to modify my plpython3u function?