postgresql 两阶段提交准备事务错误 : transactions can not be started in PL/pgSQL

标签 postgresql plpgsql distributed-transactions dblink

我想用 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 block 。

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

SQL 状态:0A000

最佳答案

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

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

关于postgresql 两阶段提交准备事务错误 : transactions can not be started in PL/pgSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52298551/

相关文章:

database - 如何使用 bash shell 中的 psql 命令执行多个查询?

sql - 如何从postgres的文本列中获取第n行

java - Spring JMS 监听器中的事务管理

.net - MSDTC促进交易分布式的可靠测试吗?

ruby-on-rails-3 - 启动 rails3.1 应用时出现 Heroku 错误,缺少 postgres gem

sql - 计算销售值(value)的 10% 回扣

postgresql - 从另一个表中删除时,如何使 PostgreSQL 向表中插入一行?

postgresql - 不明确的函数参数

database - 跨 Spring Web 应用程序的分布式事务

sql - 获取最新的 child 记录,无需给定命令