在PG-promise自动提交中执行事务控制过程

问题描述

我有这样的程序

CREATE OR REPLACE PROCEDURE "TRY-DQ-7a28fd25d95c0969bff16b963af1c832"()
LANGUAGE plpgsql
AS $$
 DECLARE "Continue" boolean :=True; 
 BEGIN
 COMMIT;
 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE READ WRITE;
    INSERT INTO test1 (a) VALUES (i);
    IF i % 2 = 0 THEN
        COMMIT;
    ELSE
        ROLLBACK;
    END IF;
COMMIT;
 END 
 $$;

我想使用PG-promise执行什么,此过程需要自动提交ON才能在pgAdmin上至少正确执行,我如何在pg-promise中实现相同?或它下面的驱动程序?

更新:

这似乎是PG中的错误/或者是我误会的东西(这是通过pg-promise出现的,所以首先我认为这与它有关)

设置:

CREATE OR REPLACE PROCEDURE "SP"(n integer)
LANGUAGE plpgsql
AS $$
 BEGIN
 FOR i IN 0..n LOOP
    COMMIT;
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE READ WRITE;
    CREATE TEMP TABLE "x" (i integer) ON COMMIT DROP;
 END LOOP;
 END 
 $$;

pg-promise调用

setInterval(() => {
    pgWriter.any(`
    DO 
    $$
    BEGIN
    CALL "SP"(10);
    END 
    $$;`)
    .then(console.log)
    .catch(console.error);
},1000);

或 pgAdmin调用

DO 
$$
BEGIN
CALL "SP"(10);
END 
$$;

结果:第一次调用失败,并显示以下消息( Only First ),在正常执行的同一连接上再次运行它。

ERROR:  SET TRANSACTION ISOLATION LEVEL must be called before any query
CONTEXT:  sql statement "SET TRANSACTION ISOLATION LEVEL SERIALIZABLE READ WRITE"
PL/pgsql function "Q"."SP"(integer) line 5 at SET
sql statement "CALL "Q"."SP"(10)"
PL/pgsql function inline_code_block line 3 at CALL
sql state: 25001

分析:到目前为止,我认为这应该是我的代码中的一个问题,也许他们在第一次运行时就进行了设置,这有助于他们以后多次运行(某些状态),也有趣的是,两行似乎很重要

  1. SET TRANSACTION ISOLATION LEVEL SERIALIZABLE READ WRITE;
  2. CREATE TEMP TABLE "x" (i integer) ON COMMIT DROP;

如果其中任何一个被注释,错误就会消失。

如果社区对此一无所知,或者我的代码中出现错误,将对您有所帮助。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)