ORA-04091: table is mutating, trigger/function may not see it

简介:

今天在论坛里发现了一个关于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]  view plain  copy
 
  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]  view plain  copy
 
  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]  view plain  copy
 
  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的看法是:唯一的用途就是作审计日志,其他一概不该使用。
有人建议是取消使用触发器,把你的业务逻辑写到存储过程去。

分类:  ORACLE

本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/p/6171050.html ,如需转载请自行联系原作者
相关文章
|
Java Windows
【Azure Function】部署Java Function失败:报错deploy [ERROR] Status code 401和警告 'China North 3' may not be a valid region
1:deploy [ERROR] Status code 401, (empty body). 2: China North 3 may not be a valid region,please refer to https://aka.ms/maven_function_configuration#supported-regions for values. 3:  <azure.functions.maven.plugin.version>1.36.0</azure.functions.maven.plugin.version>
563 11
【Azure Function】Azure Function中的Timer Trigger无法自动触发问题
【Azure Function】Azure Function中的Timer Trigger无法自动触发问题
184 1
|
JSON 数据格式 Python
【Azure 应用服务】Azure Function Python函数中,如何获取Event Hub Trigger的消息Event所属于的PartitionID呢?
【Azure 应用服务】Azure Function Python函数中,如何获取Event Hub Trigger的消息Event所属于的PartitionID呢?
184 0
|
消息中间件 域名解析 网络协议
【Azure 应用服务】部署Kafka Trigger Function到Azure Function服务中,解决自定义域名解析难题
【Azure 应用服务】部署Kafka Trigger Function到Azure Function服务中,解决自定义域名解析难题
265 0
|
消息中间件 Kafka 网络安全
【Azure 应用服务】本地创建Azure Function Kafka Trigger 函数和Kafka output的HTTP Trigger函数实验
【Azure 应用服务】本地创建Azure Function Kafka Trigger 函数和Kafka output的HTTP Trigger函数实验
196 0
|
SQL HIVE
数仓面试重灾区之-Generic User-defined Table Generating Function(UDTF)
数仓面试重灾区之-Generic User-defined Table Generating Function(UDTF)
316 0
|
安全 C语言
警告 1 warning C4996: ‘scanf‘: This function or variable may be unsafe.
警告 1 warning C4996: ‘scanf‘: This function or variable may be unsafe.
|
关系型数据库 MySQL 数据库
View ‘information_schema.SCHEMATA‘ references invalid table(s) or column(s) or function(s) or define
View ‘information_schema.SCHEMATA‘ references invalid table(s) or column(s) or function(s) or define
554 0
|
安全
VS2019 error C4996: ‘scanf‘: This function or variable may be unsafe 错误
VS2019 error C4996: ‘scanf‘: This function or variable may be unsafe 错误
647 0
VS2019 error C4996: ‘scanf‘: This function or variable may be unsafe 错误
|
Python
Flask - 访问返回字典的接口报错:The view function did not return a valid response. The return type must be a string, tuple, Response instance, or WSGI callable, but it was a dict.
Flask - 访问返回字典的接口报错:The view function did not return a valid response. The return type must be a string, tuple, Response instance, or WSGI callable, but it was a dict.
1879 0
Flask - 访问返回字典的接口报错:The view function did not return a valid response. The return type must be a string, tuple, Response instance, or WSGI callable, but it was a dict.

热门文章

最新文章