今天在论坛里发现了一个关于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避免错误.

  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,所以报错。

那应该怎么改呢?

  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;

  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的看法是:唯一的用途就是作审计日志,其他一概不该使用。
有人建议是取消使用触发器,把你的业务逻辑写到存储过程去。

最新文章

  1. EF中的实体类型【Types of Entity in Entity】(EF基础系列篇8)
  2. PeopleSoft Home Subdirectories
  3. shell基础(一)
  4. 美国L1签证和B1,E2签证的区别
  5. cocos2dx内存管理的一些看法
  6. Nlog从下载到使用例子
  7. ANDROID对文件的操作
  8. python操作---RabbitMQ
  9. IDEA+PHP+XDebug调试配置
  10. 笔记:Spring Boot 配置详解
  11. Mybatis框架基础支持层——反射工具箱之对象工厂ObjectFactory&DefaultObjectFactory(5)
  12. java(7)数组
  13. MySQL 基础三 函数(聚合、字符串、时间、条件判断)
  14. ZJOI-2017 R1游记
  15. python基础-装饰器,生成器和迭代器
  16. Mac Mini 2011 mid 安装Ubuntu18.06.1 Server
  17. UltraEdit配置
  18. 01.Web基础和HTML初始
  19. BFS+状态压缩DP+二分枚举+TSP
  20. Android Touch 事件总结

热门文章

  1. Javascript 创建对象方法的总结
  2. jQuery LayDate 日期控件
  3. SharePoint 2013 自定义扩展菜单(二)
  4. Android项目实战(二十七):数据交互(信息编辑)填写总结
  5. Mysql数据库的基本概念和架构
  6. Spring 中classPath:用法
  7. mac系统及xcode使用的SVN客户端安装升级
  8. Linux命令学习总结:date命令
  9. sql server 2000,Log.LDF文件丢失,附加数据库失败的解决办法[转]
  10. log4net不同logger输出日志