关于ORA-04091异常的出现原因,以及解决方案
来源:互联网 发布:淘宝搜索最多关键字 编辑:程序博客网 时间:2024/04/29 05:20
1、异常出现的场景.
:在使用Hibernate做为项目持久层的情况下,需要对某一张表进行一个扩展,扩展操作便是在该表上创建一个触发器。将表中的数据读入到其他表中。
-4091,ORA-04091: 表 DD123.DO_TABLE_47 发生了变化, 触发器/函数不能读它
SQL语句如下:
- drop table tr_table;
- create table tr_table(--触发器作用表
- tab_id number primary key,
- tab_name varchar2(30) NOT NULL
- )
- create table ts_tableas select * from tr_table; --提供扩展功能的表
- --定义的触发器,在tr_table表插入和更新数据之后向ts_table表插入当前操作的信息行。
- create trigger iu_table
- after insert or update on tr_table
- for each row
- begin
- insert into ts_tableselect * from tr_table twhere t.tab_id = :new.tab_id;
- end is_table;
- --对tr_table执行插入操作,触发ts_table插入操作
- insert into tr_table(tab_id,tab_name)values(1,'test');
- --弹出错误信息提示
- --ORA-04091:表tr_table发生了变化 触发器/函数不能读它
- --ORA-06512: 在iu_table line 2
- --ORA-04088: 触发器iu_table 执行过程中出错
2、问题分析
:在Oracle中执行DML语句的时候是需要显示进行提交操作的。当我们进行插入的时候,会触发触发器执行对触发器作用表和扩展表的种种操作,但是这个时候触发器和插入语句是在同一个事务管理中的,因此在插入语句没有被提交的情况下,我们无法对触发器作用表进行其他额外的操作。如果执行其他额外的操作则会抛出如上异常信息。
3、解决方案
:1,我们知道,出错的原因是因为触发器和DML语句在同一事务管理中,所以方案一便是将触发器和DML语句分成两个单独的事务处理。这里可以使用Pragma autonomous_transaction; 告诉Oracle触发器是自定义事务处理。
SQL语句如下:
- create trigger iu_table
- after insert or update on tr_table
- for each row
- declare --这里是关键的地方,在变量申明的地方,指定自定义事务处理。
- pragma autonomous_transaction;
- begin
- insert into ts_tableselect * from tr_table twhere t.tab_id = :new.tab_id;
- --这里需要显示提交事务
- commit;
- end iu_table;
:2,在Oracle Trigger中有:new,:old两个特殊变量,当触发器为行级触发器的时候,触发器就会提供new和old两个保存临时行数据的特殊变量,我们可以从俩个特殊的变量中取出数据执行扩张表的DML操作。
SQL语句如下:
- create trigger iu_table
- after insert on tr_table
- for each row
- begin
- insert into ts_table(tab_id,tab_name)values(:new.tab_id,:new.tab_name);
- --这里需要注意,要知道不同的触发类型其特殊变量:new和:old保存的值的区别。
- --commit; 注意使用方案二,这里不能显示的进行提交操作操作,trigger中在没有声明自定义事务管理的时候,不能执行显示提交。
- end iu_table;
0 0
- 关于ORA-04091异常的出现原因,以及解决方案
- 关于ORA-04091异常的出现原因,以及解决方案
- 关于VC出现 0x0C150002 错误的原因以及解决方案
- ORA-01795异常的原因以及解决办法
- Android 3.0获取互联网资源时出现异常的原因分析以及解决方案
- 关于ora-24381异常出现的情况
- 关于ORACLE出现ORA-00904标识符错误的问题原因
- 网页使用ie或者360打开时按F12出现程序停止运行异常的原因以及解决方案
- 使用某些框架出现simplexml_load_string()的原因以及解决方案
- ora-01555出现的原因
- 关于ORA-02069错误[序列原因解决方案]
- 关于oracle“ORA-01810格式代码出现两次”的解决方案
- Java常见异常原因以及解决方案
- 关于Activity被染色的原因以及解决方案
- 关于Android Force Close 出现的原因 以及解决方法
- 关于Android Force Close 出现的原因 以及解决方法
- 关于Android Force Close 出现的原因 以及解决方法
- 关于Android Force Close 出现的原因 以及解决方法
- SVN回退到某版本的命令
- apt-get常用命令
- 编辑文章 - 博客频道 - CSDN.NET
- [整理]在JavaScript中创建静态方法和属性的对象
- mysql5.5一插入数据就提示ERROR 2013 (HY000): Lost connection to MySQL server during query,且mysql服务自动关闭
- 关于ORA-04091异常的出现原因,以及解决方案
- ASP.NET和MSSQL高性能分页
- 两老太上南山种蔬菜 捡到几公斤现金
- 紫外线杀菌器在工业应用中的技术优势指南
- EasyHook库系列使用教程之一写在之前
- 提高js拼接字符串效率--自定义StringBulider
- Hibernate Tools-代码生成cfg.xml,hbm.xml和持久類
- [ACM] hdu Find a way
- nyoj38(布线问题)(prim算法)