首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Postgresql中不支持事务块中调用plpgsql回滚(多层exception、事务块有检查点)

前言 Postgresql使用子事务来实现EXCEPTION的功能,即在进入EXCEPTION的存储过程前,会自动起一个子事务,如果发生了异常,则自动回滚子事务,达成EXCEPTION的效果。...目前下面代码中的rollback会直接报错不支持,但报错被exception掩盖了,所以后续的行为不再分析了。只是做一些记录。...第一次CALL在事务块内,所以使用子事务ID3,第二次CALL在p_transaction_caller的子事务内,所以使用子事务ID4。.../pgsrc/src/backend/main/main.c:200 2 回滚前后estate->eval_econtext的状态变化 注意到SPI_rollback后,使用plpgsql_create_econtext...(estate); return PLPGSQL_RC_OK; } 这里还是在深层exec_stmt_rollback位置,在执行真的rollback前: 现在有两层CALL: ExecuteCallStmt

68310

OracleMysql迁移到Postgresql事务回滚行为差异及改造方法

Mysql或Oracle迁移到Postgresql系产品后,经常会发生事务回滚导致的问题,具体问题一般都是类似于: 为什么我没rollback,我的事务就自己回滚了?...这里就不再贴报错了,我贴下单步调试的过程更容易理解 第一个差异点:事务内SQL报错后,再执行任何语句都会抛异常 在报错后的事务内再执行查询,报PG的标准错误: org.postgresql.util.PSQLException...不可以,在报错时事务已经回滚,虽然提交没有报错,但是写入的数据不会生效 commit后 数据没有写入: 迁移到Postgresql后如何改造?...方案一:PL/pgSQL 使用Postgresql提供的PL/pgSQL语法,将相关逻辑写入PG的函数中,使用PG的EXCEPTION语法封装响应的处理逻辑,在业务代码中调用函数即可保证事务不会中断。...https://www.postgresql.org/docs/9.1/plpgsql-control-structures.html#PLPGSQL-ERROR-TRAPPING [

1.1K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Postgresql源码(50)语法解析时关键字判定原理(函数名不能使用的关键字为例)

    相关: 《Postgresql源码(44)server端语法解析流程分析》 《Postgresql源码(50)语法解析时关键字判定原理(函数名不能使用的关键字为例)》 关键字报错场景 关键字不出现...lex返回522后,yacc语法树没有匹配项了,返回错误。 [lex] NORMALIZE = 522 [yacc] if (!...core_yylex需要返回它遇到的标识符类型并将其值存储在yylval中,这些标识符在gram.y中定义: gram.y %token ABORT_P ABSOLUTE_P ACCESS...但其实很多也不会触发冲突,为了使用这些关键字,在gram.y文件后面专门定义了几组语法规则: unreserved_keyword:可以用于任意命名场景,如果新增的关键字不会引发shift/reduce...增加方法:先确定新增关键字会不会造成语法冲突歧义等,加到上面5个list中,然后根据能否用于表名、列名、as等场景,在kwlist中增加即可。

    82330

    --PostgreSQL 的存储过程怎么写 与 质疑

    PostgreSQL 的存储过程在POSTGRESQL 11 有了改变,从统一的 create function 到 create procedure 到底能从中获得什么 1 支持了commit 和...可以避免命令的多轮解析在目前的PG11 中如果你要返回一个表的查询内容,从现在11到PG12,目前存储过程 是无法满足这个需求的。目前如果要通过函数来完成在一段PLPGSQL中输出某个表的集合。...当然在POSTGRESQL 11 开始有的存储过程,在查看一些建议和资料的时候,有以下一些需要注意的地方 1 在创建trigger 中目前如果想在触发后,如果执行函数或存储过程,建议延续之前版本,继续使用函数的方式...2 在有事务断点,或者需要设置回滚或者保存点的大型的SQL 程序集的情况下,建议使用 PROCEDURE 当然也有部分人对POSTGRESQL 的存储过程提出了异议,说他根本没有像其他的数据库有事务性...; 结果如下,质疑在哪里,有些人认为在一个事务中表达的时间是一样的,而不应该是下面结果中的每运行一次就会更新一个时间。

    3.9K30

    openGauss子事务管理分析(PLpgSQL中的异常子事务)

    1 背景 PostgreSQL中的存储过程不支持使用savepoint、rollback to。...原因是PG的存储过程中,异常处理使用子事务来实现的,也就是一旦发生异常,当前procedure的begin块中执行过的所有语句都会直接回滚: procedure begin insert into...end; 当异常发生后,第二条insert没有执行到就跳转了,比较容易理解;但是第一条insert会被回滚,这种行为是PG特有的,和Oracle是有区别的,Oracle中异常发生只会跳转,不会回滚也不存在子事务...总结 场景一:对于正常结束的block,如果执行过savepoint,则异常子事务在savepoint子事务下面一层,高斯的处理是不提交异常子事务,就放在事务堆栈中。...->subTransactionId; 而PG中这个计数器是一直递增的,不能减小。

    31620

    Postgresql源码(103)PLpgSQL中的表达式ExprContext

    如果发生异常了,那么eval_econtext会跟着RollbackAndReleaseCurrentSubTransaction在子事务回滚中释放。...1 PL运行时信息:PLpgSQL_execstate PostgreSQL的PLpg/SQL中任何语句的运行,都需要记录运行时的状态信息。...在SQL层的执行器中运行时状态使用EState记录,在PL中状态信息使用PLpgSQL_execstate结构记录。...因为PL中的异常处理会自动启动子事务,为了让表达式计算申请的资源能和子事务一块释放,需要将ExprContext与子事务关联起来: 一旦子事务释放,在回调函数plpgsql_subxact_cb...eval_econtext = old_eval_econtext; } 如果发生异常了,那么eval_econtext会跟着RollbackAndReleaseCurrentSubTransaction在子事务回滚中释放

    69220

    OushuDB-PL 过程语言-声明

    因此,如果把now()赋予一个类型为timestamp的变量,那 么该变量的缺省值将为函数实际调用时的时间,而不是函数预编译时的时间。3)....CONSTANT选项是为了避免该变量在进入BEGIN块后被重新赋值,以保证该变量为常量。4). 如果声明了NOT NULL,那么赋予NULL数值给该变量将导致一个运行时错误。...在声明段中为参数变量定义别名。...行类型: 见如下形式的变量声明: table_name%ROWTYPE表示指定表的行类型,我们在创建一个表的时候,PostgreSQL也会随之创建出 一个与之相应的复合类型,该类型名等同于表名,因此,我们可以通过以上两种方式来声明行类型的变...记录类型: 见如下形式的变量声明: 记录变量类似于行类型变量,但是它们没有预定义的结构,只能通过SELECT或FOR命令来获取实际的行 结构,因此记录变量在被初始化之前无法访问,否则将引发运行时错误。

    1K20

    Postgresql快照堆栈ActiveSnapshot

    因为在事务中,有些行为是需要看到最新数据的,比如一个RR事务拿到一个快照后执行了一段时间,这时运行了一条CALL Func或触发器语句,开始进入函数的执行逻辑。...=# call p_outter(); NOTICE: count: {1,2} NOTICE: count: {1,2,10,20} 那么如果在函数p_outter执行pg_sleep期间内,在另一个会话中插入一条数据后会发生什么...代码中是在CallStmt时判断procedure则拿新的快照,旧的入栈。 3 快照堆栈 实际上PG中PushActiveSnapshot的用处非常多,例如创建索引、vacuum等等。...PG中的快照和其他资源一样,生命周期也是严格跟随事务系统的,也就是在事务提交、撤销、子事务提交、子事务撤销时,都会有快照的销毁或转移动作。...AtSubAbort_Snapshot:子事务回滚时,会遍历快照堆栈,把该子事务同层的快照直接释放掉。

    1.1K60

    Postgresql源码(53)plpgsql语法解析关键流程、函数分析

    相关 《Postgresql源码(41)plpgsql函数编译执行流程分析》 《Postgresql源码(46)plpgsql中的变量类型及对应关系》 《Postgresql源码(49)plpgsql...函数编译执行流程分析总结》 《Postgresql源码(53)plpgsql语法解析关键流程、函数分析》 0-0 总结 plpgsql_yylex等价于server端的base_yylex,都是在lex...plpgsql_parse_word/plpgsql_parse_dblword/plpgsql_parse_tripword 调用场景:一/二/三个单词的场景,在函数声明中总是返回T_WORD 功能:...,启用PLword *word T_DATUM例子:上面用例中的i3 = -1;,i3已经定义过在ns中了,所以在后面遇到i3就有意义了。...3 plpgsql_parse_word/plpgsql_parse_dblword/plpgsql_parse_tripword 调用场景:一/二/三个单词的场景,在函数声明中总是返回T_WORD 功能

    1.1K40

    调用PostgreSQL存储过程,找不到函数名的问题

    PostgreSQL的表,函数名称都是严格区分大小写的,所以在使用的时候没有注意大小写问题容易导致找不到函数名的错误,但最近两天我们发现,如果函数参数使用了自定义的数据类型,也会发生这个问题。...BEGIN   update JJZB set gzd=COALESCE(gzd,0)+1 where JJZB.Jjdm=$1 ;   --return 1; END; $BODY$   LANGUAGE plpgsql...BEGIN   update JJZB set gzd=COALESCE(gzd,0)+1 where JJZB.Jjdm=$1 ;   --return 1; END; $BODY$   LANGUAGE plpgsql...问题影响: 在WFT中,所有使用.NET程序调用PostgreSQL存储过程的代码,如果存储过程的参数使用了自定义的类型(例如citex),均会受影响。...解决方案: a,建议不要在PostgreSQL函数的参数中使用自定义的类型,如果要想对参数进行大小写转换,建议在函数体中使用另外一个Pgsql变量,函数中执行查询的SQL语句使用这个新变量,而不是直接使用这个函数参数

    2K50

    进阶数据库系列(十一):PostgreSQL 存储过程

    PostgreSQL 概述 在 PostgreSQL 中,除了标准 SQL 语句之外,通过创建复杂的过程和函数来满足程序需要,我们称为存储过程和自定义函数(User-Defined Function)。...在一个块中的每一个声明和每一个语句都由一个分号终止。 所有的关键词都是大小写无关的。除非被双引号引用,标识符会被隐式地转换为小写形式,就像它们在普通 SQL 命令中。...; 提示信息 官方文档:http://postgres.cn/docs/12/plpgsql-errors-and-messages.html 使用raise语句报告消息以及抛出错误,上面给的示例中已经有部分给出...游标是 PL/pgSQL 中的一个强大的数据处理功能,更多的使用方法可以参考官方文档:https://www.postgresql.org/docs/current/plpgsql-cursors.html...事务管理 在存储过程内部,可以使用 COMMIT 或者 ROLLBACK 语句提交或者回滚事务。

    4.1K21

    Oracle与Postgresql在PLSQL内事务回滚的重大差异

    相关 《Oracle/Mysql迁移到Postgresql事务回滚行为差异及改造方法》 《Oracle与Postgresql在PLSQL内事务回滚的重大差异》 这个差异点非常容易造成Oracle...1 总结 先放总结 Oracle:在PLSQL内如果语句执行失败,进入异常处理程序后,PL程序正常退出。那么在执行失败语句前面的SQL不会回滚,执行结果都正常提交了。...Postgresql:在PLPGSQL内如果语句执行失败,进入异常处理程序后,PL正常退出。...那么整个PL内的所有SQL自动回滚,因为: PG不支持PL内写SAVEPOINT (Oracle在每个语句前有隐式的savepoint) PL整体包装在一个大事务内。...THEN DBMS_OUTPUT.PUT_LINE('Insert was rolled back'); END; / select * from emp_name; 结果 3 测试用例Postgresql14

    59510

    Postgresql源码(80)plpgsql中异常处理编译与执行流程分析(sqlstate)

    相关 《Postgresql中plpgsql异常处理方法与实例(RAISE EXCEPTION)》 《Postgresql源码(80)plpgsql中异常处理编译与执行流程分析(sqlstate)...->condname = yylval.word.ident 第三步:识别单词含义,去exception_label_map字符串数组中匹配名字,下面介绍这个数组 plpgsql_recognize_err_condition..."division_by_zero", message = 0x0, params = 0x0, options = 0x0} exception_label_map数组 保存{错误名...,错误码}的数组,例如division_by_zero: typedef struct { const char *label; int sqlerrstate; } ExceptionLabelMap...} 2.3 语法树匹配:proc_condition 进入plpgsql_parse_err_condition返回exception_label_map数组中的匹配元素: PLpgSQL_condition

    46010

    Postgresql源码(93)Postgresql函数内事务控制实现原理(附带Oracle对比)

    相关 《Postgresql源码(60)事务系统总结》 《Postgresql源码(93)Postgresql函数内事务控制实现原理(附带Oracle对比)》 0 总结 Postgresql...区别是:Postgresql目前还不支持在事务块内,调用带有commit的函数;Oracle是支持的。 (即显示begin启动事务,调用带有commit的函数) 还有游标部分也有一些差别。...1 Postgresql函数内事务控制介绍 PATCH:8561e4840c81f7e345be2df170839846814fa004 增加了plpgsql中事务控制的功能,即实现在plpgsql内执行...2 Postgresql实现函数内事务控制的源码分析 PATCH在函数调用的入口增加了atomic变量 ExecuteCallStmt(ParseState *pstate, CallStmt *stmt...standard_ProcessUtility函数中IsTransactionBlock() plpgsql_call_handler函数中fcinfo->context plpgsql_call_handler

    1.1K20

    【项目实战经验】一文搞懂云数据库PostgreSQL与MySQL实践案例

    腾讯云云数据库 PostgreSQL 简介云数据库 PostgreSQL 能够让您在云端轻松设置、操作和扩展目前功能最强大的开源数据库 PostgreSQL,腾讯云将负责绝大部分处理复杂而耗时的管理工作...,如 PostgreSQL 软件安装、存储管理、高可用复制、以及为灾难恢复而进行的数据备份,让您更专注于业务程序开发。...Tinyint(1)可以存储的最大值为127,而Tinyint(4)可以存储的最大值为9999。这意味着,如果使用Tinyint(1)存储大于127的值,将会出现溢出的情况,导致数据错误。...name VARCHAR(100) NOT NULL, quantity TINYINT(4) NOT NULL);项目报错实际由于估测场景缺失,造成未评估字段长度报错,改为int后又再次上线解决未引发错误...这个例外是unchecked,如果遇到checked意外就不回滚。

    97730

    Postgresql在RR级别(可重复读)不会出现幻读

    Postgresql对比Mysql一个重要的差一点就在于Phantom Read,在Mysql的RR级别下,幻读是可以出现的,下面构造一个场景来说明这个问题。...INSERT 0 1 insert into tbl1 values (3, 'geller'); 注意,这里会直接报主键冲突,但是事务并不回滚...上述场景的差异:MYSQL发生了幻读,而PG会等待其他事务的行为进而作出不同的相应: 其他事务提交:为避免幻读直接回滚当前事务 其他事务回滚:正常提交 PG对于事务行为有更为苛刻的保证,使用回滚的方式避免幻读...INSERT 0 1 insert into tbl1 values (3, 'geller'); 注意,这里会直接报主键冲突,但是事务并不回滚...上述场景的差异:MYSQL发生了幻读,而PG会等待其他事务的行为进而作出不同的相应: 其他事务提交:为避免幻读直接回滚当前事务 其他事务回滚:正常提交 PG对于事务行为有更为苛刻的保证,使用回滚的方式避免幻读

    73020
    领券