postgresql两阶段提交准备事务错误:事务无法在PL / pgSQL中启动

问题描述 投票:1回答:1

我想为PostgreSQL做一个两阶段提交事务和准备事务。

你能帮忙解决这个错误吗?

我无法理解如何通过dblink与prepare transaction连接到远程数据库?

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中启动事务

提示:使用带有EXCEPTION子句的BEGIN块。

语境:insert_into_table_a()PL / pgSQL函数,第24行,在EXECUTE中

SQL状态:0A000

postgresql plpgsql distributed-transactions dblink
1个回答
0
投票

因此,在Postgres中,大多数情况下无法控制内部函数的事务。如果没有捕获它们,你可以引发错误以间接中止它们,但你不能像这样直接开始或结束它们。

要管理事务,您需要将工作进程作为可加载模块,或者通过连接从客户端控制事务。

© www.soinside.com 2019 - 2024. All rights reserved.