【发布时间】:2018-09-12 15:17:44
【问题描述】:
我想为 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 中启动事务
提示:改用带有 EXCEPTION 子句的 BEGIN 块。
CONTEXT: insert_into_table_a () PL / pgSQL 函数,第 24 行,在 EXECUTE 中
SQL 状态:0A000
【问题讨论】:
-
阅读错误信息和提示后还有哪些问题未解决?您只是无法管理 PL/pgSQL 中的事务。 PostgreSQL v11 将允许在 PL/pgSQL 中进行一些事务处理。
-
@LaurenzAlbe 我在使用 v10 时遇到问题
-
也许这可以帮助你:wiki.postgresql.org/wiki/…
标签: postgresql plpgsql distributed-transactions dblink