当前位置: 首页 > news >正文

简约网站模版百度网站建设工具

简约网站模版,百度网站建设工具,湖南网站制作电话,电子商务网站开发开题报告ORACLE报错:ORA-04091 表发XXX生了变化,触发器/函数不能读它 问题描述问题分析解决办法拓展:自治事务的特点 问题描述 在开发校验函数FUNCTION的时候,用数据跑批测试的时候报错。经排查这个校验函数FUNCTION的被一个存储过程中的update语句调…

ORACLE报错:ORA-04091 表发XXX生了变化,触发器/函数不能读它

  • 问题描述
  • 问题分析
  • 解决办法
  • 拓展:自治事务的特点

问题描述

在开发校验函数FUNCTION的时候,用数据跑批测试的时候报错。经排查这个校验函数FUNCTION的被一个存储过程中的update语句调用了。所以update更新数据的同时,又select了校验函数FUNCTION,猜测这两个事务冲突了导致了这个报错。

校验存储过程例如代码所示,校验存储过程P_CHECK_VALUE中的update调用了校验函数PKG_CHECK_VALUE.F_CHECK_VALUE(ARG1, ARG2):

--调用校验的存储过程
CREATE OR REPLACE PROCEDURE P_CHECK_VALUE(V_TABLENAME VARCHAR2, V_DECLAREDATE VARCHAR,V_BATCHNO VARCHAR2 DEFAULE NULL,V_4 VARCHAR2 DEFAULT NULL) IS
BEGINFOR CAL IN (...) LOOPV_SQL = 'UPDATE TABLE1 SET TABLE1.A1 = TABLE1.A1 || (SELECT TABLE2.B2 FROM TABLE2 WHERE TABLE2.NUM1 = PKG_CHECK_VALUE.F_CHECK_VALUE(ARG1, ARG2))';EXECUTE IMMDEIATE V_SQL;COMMIT;END LOOP;
END;

校验函数是写在校验包里的,例如:

--校验包的函数
CREATE OR REPLACE PACKAGE BODY "PKG_CHECK_VALUE" ISFUNCTION F_CHECK_VALUE(ARG1 VARCHAR2, ARG2 VARCHAR2) RETURN INTEGER ISBEGINSELECT COUNT(*) > 0 THEN 1 ELSE 0 ENDINTO RESULT FROM TABLE1 WHERE ...;RETURN(RESULT);END;END;
END PKG_CHECK_VALUE;

问题分析

在函数中查询某张表前对表做了更新和插入操作,使表数据发生了变化,而函数返回的数据已经发生变化,导致出错.
如果既对同一个表进行update,又调用其他触发器/函数对同一个表进行查询select操作,猜测是这两个操作同时处理一张表,导致两个事务冲突了。
不清楚会先update再select,还是先select再update,总之这两个操作是对同一张表进行了增删改查处理了。

解决办法

在函数BEGIN之前加入一个自治事务pragma autonomous_transaction;**,其中PRAGMA关键字通知PL/SQL编译器,将声明它的这个PL/SQL代码块分割为一个自治的或独立的事务。这意味着在使用 PRAGMA AUTONOMOUS_TRANSACTION 的函数或过程中,可以执行 SQL 操作并提交或回滚这些操作,而不会影响主事务中的数据。(例子中的主事务是update操作,子事务是函数的select操作)总的来说,PRAGMA AUTONOMOUS_TRANSACTION 的作用是在 PL/SQL 中创建一个独立的事务,用于执行与主事务完全独立的操作,通常用于记录日志。

PRAGMA AUTONOMOUS_TRANSACTION中文翻译过来叫“自治事务”(翻译的还算好理解),对于定义成自治事务的Procedure,实际上相当于一段独立运行的程序段,这段程序不依赖于主程序,也不干涉主程序
pragma autonomous_transaction;

修改后如下所示,不会报错了:

--校验包的函数
CREATE OR REPLACE PACKAGE BODY "PKG_CHECK_VALUE" ISFUNCTION F_CHECK_VALUE(ARG1 VARCHAR2, ARG2 VARCHAR2) RETURN INTEGER ISpragma autonomous_transaction;	--事务自治BEGINSELECT COUNT(*) > 0 THEN 1 ELSE 0 ENDINTO RESULT FROM TABLE1 WHERE ...;RETURN(RESULT);END;END;
END PKG_CHECK_VALUE;

拓展:自治事务的特点

  • 第一,这段程序不依赖于原有Main程序,比如Main程序中有未提交的数据,那么在自治事务中是查找不到的。

  • 第二,在自治事务中,commit或者rollback只会提交或回滚当前自治事务中的DML,不会影响到Main程序中的DML。

http://www.yayakq.cn/news/119256/

相关文章:

  • 义乌网站建设联系方式如何禁止通过ip访问网站
  • 长沙网站推广网站分为几部分
  • 哈尔滨 做网站江苏省住建厅官方网
  • 地方网站盈利模式软件开发是做什么工作的
  • 网站的栏目结构简图怎么做微商城网站建设市场
  • 海南建设工程信息网站建站服务器多少钱
  • 93zyz资源网站生态文明建设为网站多少页面合适
  • 没有营业执照可以建设网站免费建站系统哪个好用吗
  • 网站排名在线优化工具济南电子商务网站建设
  • wordpress 仿简书杭州seo公司服务
  • wordpress数据在哪个文件夹百度seo关键词优化排名
  • 河池市住房城乡建设网站wordpress 作者推荐
  • 河南网站推广多少钱搜索引擎的工作原理是什么?
  • 怎么做算命网站辽宁pc网站建设开发
  • 开源网站 做镜像 如何做成全视频免费观看在线看古装电视剧
  • 怎么修复网站死链山西省两学一做网站
  • 杭州网站推广方式网络营销模式包括哪些
  • 天津网站制作企业wordpress 父类 id
  • 做网站赌钱犯法吗装修公司谁做网站
  • 建设企业营销型网站高端网站定制设计
  • 网站建设什么好济南网络营销外包
  • 深圳龙岗区住房和建设局网站官网制冷机电工程东莞网站建设
  • 移动端网站怎么布局简述一个商务网站建设的步骤
  • 绿色环保材料网站模板下载天津网站开发培训
  • 西宁网站建设的公司在阿里云服务器做淘客网站
  • 后台网站要做权限前端还是后台做时尚类网站建设
  • 企业网站开发 文献综述沧州到黄骅
  • 柳州网站建设排行榜公司注册网上签字流程
  • 服务器做网站配置怎样更新网站
  • 国家和住房城乡建设部网站抑郁症状有哪些表现免费咨询