我想用PostgreSQL的prepare事务进行两阶段提交事务。
您能帮忙解决此错误吗?
我不明白如何通过dblick和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中启动事务
提示:请将BEGIN块与EXCEPTION子句一起使用。
上下文:insert_into_table_a()执行中的PL / pgSQL函数,第24行
SQL状态:0A000
答案 0 :(得分:0)
因此,在Postgres中,大部分情况下您不能从内部函数控制事务。如果未捕获到错误,则可以引发错误以间接中止它们,但是您不能像这样直接开始或结束它们。
要管理事务,您要么需要一个工作进程作为可加载模块,要么要通过连接从客户端控制事务。