PostgreSQL存储过程中怎么利用BEGIN块处理事务
发表于:2025-12-05 作者:千家信息网编辑
千家信息网最后更新 2025年12月05日,PostgreSQL存储过程中怎么利用BEGIN块处理事务,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、用BEGIN块模拟随便建个表
千家信息网最后更新 2025年12月05日PostgreSQL存储过程中怎么利用BEGIN块处理事务
PostgreSQL存储过程中怎么利用BEGIN块处理事务,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
1、用BEGIN块模拟
随便建个表:
CREATE TABLE a(col1 int);
存储过程如下:
CREATE OR REPLACE FUNCTION ins_t() RETURNS voidAS $$BEGIN INSERT INTO a VALUES(100); BEGIN INSERT INTO a VALUES(200); RAISE 'any error'; EXCEPTION WHEN others THEN null; END;END;$$ LANGUAGE plpgsql;
测试:
flying=# SELECT ins_t(); ins_t-------(1 row)flying=# SELECT * FROM a; col1------ 100(1 row)
可以看到,内嵌BEGIN块中的INSERT操作并没有生效。
2、PL/pgSQL如何实现
块定义在pl_gram.y中,有兴趣可以自己去看,块的执行代码位于 src/pl/plpgsql/src/pl_exec.c。
static intexec_stmt_block(PLpgSQL_execstate *estate, PLpgSQL_stmt_block *block){... if (block->exceptions) {... BeginInternalSubTransaction(NULL);... PG_TRY();... PG_CATCH();... RollbackAndReleaseCurrentSubTransaction();...只有当块定义有EXCEPTION部分,才会出现创建子事务的动作,否则(它对应的else分支内)只会当做普通语句处理。抛出例外时,就把这个子事务会滚掉。
而如果不抛出例外,而是WARNING或者NOTICE之类,也不会引起它的回滚,尝试一下就知道。PG怎么知道要不要回滚,关键在PG_TRY,这个说起来话长,暂时了解到这里足够。
3、没有EXCEPTION处理会怎样
去掉例外处理部分
CREATE OR REPLACE FUNCTION ins_t() RETURNS voidAS $$BEGIN INSERT INTO a VALUES(100); BEGIN INSERT INTO a VALUES(200); RAISE 'any error'; END;END;$$ LANGUAGE plpgsql;
结果什么都没有,因为它没有启用子事务,所以会全部回滚。
flying=# select ins_t();ERROR: any errorCONTEXT: PL/pgSQL function ins_t() line 6 at RAISEflying=# select * from a; col1------(0 rows)flying=#
4、神奇的PG_TRY和PG_CATCH
它们用到的是sigsetjmp,PG中很多地方用到它,了解这个可能需要一定的汇编语言知识,也需要了解错误抛出机制,有机会再详细讲。
看完上述内容,你们掌握PostgreSQL存储过程中怎么利用BEGIN块处理事务的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!
事务
处理
过程
存储
内容
方法
更多
部分
问题
普通
神奇
束手无策
为此
汇编语言
个子
代码
关键
兴趣
分支
动作
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
fm2016数据库的选择
深圳刘进总经理软件开发
中纪委网络技术中心怎么样
针对网络贷款如何看待网络安全
服务器管理芯片国产
linux多台服务器同步文件
深信服互联网网络安全
如何查询sql数据库的表名
vscode 连服务器
深圳软件开发要多久
运动规划软件开发
小学生网络安全短视频怎么拍
2018年国家网络安全事件
拍卖平台软件开发
数据库的更新
三级网络技术破解版题库
计算网络技术招聘
软件开发所需要的证书
网络安全作文800字
信息技术网络安全管理规范
六一节我的世界好玩的生存服务器
深信服互联网网络安全
服务器必备工具
网络技术讲师招聘信息
智慧识别网络技术
qqbot数据库修改
数据库监控硬件
数据库是啥东西
安康展厅互动软件开发公司
purley服务器