PostgreSQL存储过程中怎么利用BEGIN块处理事务
发表于:2025-02-05 作者:千家信息网编辑
千家信息网最后更新 2025年02月05日,PostgreSQL存储过程中怎么利用BEGIN块处理事务,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、用BEGIN块模拟随便建个表
千家信息网最后更新 2025年02月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安全错误
数据库的锁怎样保障安全
h3csecpath服务器
租用服务器要多少钱
大连港龙网络技术有限公司
连接数据库sid是什么意思
服务器双线路
接收服务器管理权限
天地伟业软件开发面试题
坚两优58国家水稻数据库
银行网络安全概念股龙头
华为服务器管理口登录密码
mysql数据库怎么设置文件
川拍法辅网络技术有限公司
聚焦网络技术官网
新奇科技互联网之光
全球 dns 服务器
互联网车险评驾科技
服务器国产化图片
数据库主辅未同步
ss云服务器推荐
网络技术南阳
应用软件开发基础选择
盈九州网络技术有限公司
郑州创业服务器
选择题什么不属于网络安全特性
网络安全文明建设的宣传内容
网络安全观影活动心得400字
用友8.11数据库
力控专家报表与数据库连接
数据库权限 755
如何在指定数据库建表