Ошибка транзакции подготовки двухфазного коммита postgresql: транзакции не могут быть запущены в PL / pgSQL - PullRequest
0 голосов
/ 12 сентября 2018

Я хотел бы сделать транзакцию двухфазного принятия с подготовкой транзакции для PostgreSQL.

Не могли бы вы помочь с ошибкой?

Я не могу понять, как подключиться к удаленной базе данных черезdblick с подготовкой транзакции?

create or replace function insert_into_table_a() returns void as $$
    declare 
        trnxprepare text;
        trnxcommit text;
        trnxrollback text;
        trnxid varchar;
begin

    select uuid_generate_v4() into trnxid;
    select 'prepare transaction ' || ' ''' || trnxid || ' ''' into trnxprepare;
    select 'commit prepared     ' || ' ''' || trnxid || ' ''' into trnxcommit;
    select 'rollback prepared   ' || ' ''' || trnxid || ' ''' into trnxrollback;

    insert into table_a values ('test');
    perform dblink_connect('cn','dbname=test2 user=test2user password=123456');
    perform dblink_exec('cn','insert into table_b values (''test 2'');');
    perform dblink_disconnect('cn');

    execute trnxprepare;
    execute trnxcommit;

    exception 
        when others then
            execute trnxrollback;
            perform dblink_disconnect('cn');
            raise notice '% %', sqlerrm, sqlstate;
end;
$$ language plpgsql;




select insert_into_table_a();

ОШИБКА: ОШИБКА: транзакции не могут быть запущены в PL / pgSQL

СОВЕТ: Вместо этого используйте блок BEGIN с предложением EXCEPTION.

CONTEXT: insert_into_table_a () Функция PL / pgSQL, строка 24, в EXECUTE

Состояние SQL: 0A000

1 Ответ

0 голосов
/ 14 сентября 2018

Итак, в Postgres вы по большей части не можете контролировать транзакции изнутри функций.Вы можете выдавать ошибки, чтобы косвенно прервать их, если они не обнаружены, но вы не можете начинать или заканчивать их напрямую, как это.

Чтобы управлять транзакциями, вам потребуется рабочий процесс в качестве загружаемогомодуль или для управления транзакцией от клиента через соединение.

...