博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ORA-04091: table is mutating, trigger/function may not see it
阅读量:5082 次
发布时间:2019-06-13

本文共 1344 字,大约阅读时间需要 4 分钟。

今天在论坛里发现了一个关于ORA-04091的老帖子,收获良多,特此整理一下

关于ORA-04091: table is mutating, trigger/function may not see it的分析

当DML操作触发trigger的时候,如果trigger的程序块中需要对当前表进行修改或查询的时候,就会报错
ORA-04091: table is mutating, trigger/function may not see it

这是有在被触发TRIGGER工作的时候,默认把当前表表锁死,不允许对其进行操作,所以trigger包含对当前表的DML操作就会报错,那怎么办?最常用的方法是通过修改SQL避免错误.

 

 

[sql]   
 
  1. create or replace trigger tr_test  
  2. after insert   
  3. on test  
  4. for each row  
  5. begin  
  6.    update test set column2=123 where column1=:new.column1  
  7. end tr_test;  

这就是个典型的错误的例子,肯定会报错ORA-04091,这个trigger是为了修改新插入的行的某列,因为插入后当前表已经被锁死了,所以根本没有办法update,所以报错。

 

那应该怎么改呢?

 

[sql]   
 
  1. create or replace trigger tr_test  
  2. before insert  
  3. on test  
  4. for each row  
  5. begin  
  6.    :new.column2:=123  
  7. end tr_test;  

在出入前就修改好要修改的值,就不会报错了

但是这种方法浪费时间精力,更重要的并不是所有问题都可以找到这样的方法绕过去.

还有一种方法是加 PRAGMA AUTONOMOUS_TRANSACTION;

 

[sql]   
 
  1. create or replace trigger tr_test  
  2. after insert   
  3. on test  
  4. for each row  
  5. declare  
  6. PRAGMA AUTONOMOUS_TRANSACTION;  
  7. begin  
  8.    update test set column2=123 where column1=:new.column1  ;
  9.    commit;
  10. end tr_test;  

这样也可以执行成功。

 

AUTONOMOUS_TRANSACTION是指在function,procedure,trigger等subprograms中对事务进行自治管理,当在别的pl/sql block里取调用这些subprograms的时候这些subprograms并不随着父pl/sql block的失败而回滚,而是自己管自己commit;

注意慎用AUTONOMOUS_TRANSACTION。一个DML可能触发很多次触发器,因此产生了大量独立的事务,很容易产生死锁。

ASKTOM上对AUTONOMOUS_TRANSACTION的看法是:唯一的用途就是作审计日志,其他一概不该使用。
有人建议是取消使用触发器,把你的业务逻辑写到存储过程去。

转载于:https://www.cnblogs.com/soundcode/p/6171050.html

你可能感兴趣的文章
多文档界面的实现(DotNetBar的superTabControl)
查看>>
3.字符串
查看>>
关于深复制与浅复制
查看>>
js 重写a标签的href属性和onclick事件
查看>>
关于需要授权处理获取数据的跳转
查看>>
17Web服务器端控件
查看>>
历年春节日期
查看>>
Oracle中运用PL/SQL操作COM工具-1
查看>>
Informix IDS 11细碎经管(918检验)认证指南,第8局部:面向经管员的SQL特征(7)
查看>>
Python2.7 学习体会 @classmethod @staticmethod @property 之间的关系
查看>>
随心而动
查看>>
Github库名命名规范
查看>>
Kotlin基础(三)类、对象和接口
查看>>
centos7.5 源码安装gitlab使用mysql数据库
查看>>
那些年我们踩过的linux坑(1)
查看>>
Android学习笔记(五三):服务Service(下)- Remote Service
查看>>
工厂模式
查看>>
Public KEY
查看>>
与像素无关的dp单位与像素单位px之间的转换
查看>>
04.Spring Ioc 容器 - 刷新
查看>>