У меня есть ситуация, когда я должен совершить часть кода как собственную транзакцию.
Я создал таблицу subtransaction_tbl
:
CREATE TABLE subtransaction_tbl
(
entryval integer
)
И функция на языке 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;
Первая ситуация:
BEGIN TRANSACTION;
INSERT INTO subtransaction_tbl VALUES (4);
select subtransaction_nested_test_t();
COMMIT TRANSACTION;
Записи в таблице верны: 1,2,4
Вторая ситуация:
BEGIN TRANSACTION;
INSERT INTO subtransaction_tbl VALUES (4);
select subtransaction_nested_test_t();
ROLLBACK TRANSACTION;
Значения в таблице не заполняются
Я ожидал, что 1
или 2
следует добавить в таблицу subtransaction_tbl
, но, к моему удивлению, значение не было вставлено. Я представил себе, что функция открыла новое подтранзакцию, и она не должна зависеть от родительской транзакции. Пожалуйста, дайте мне знать, прав я или нет.
Существуют ли автономные транзакции в Postgres? Или мне нужно изменить функцию plpython3u?