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 plaincopy
這就是個典型的錯誤的例子,肯定會報錯ORA-04091,這個trigger是為了修改新插入的行的某列,因為插入后當前表已經被鎖死了,所以根本沒有辦法update,所以報錯。
那應該怎么改呢?
[sql]?view plaincopy在出入前就修改好要修改的值,就不會報錯了
但是這種方法浪費時間精力,更重要的并不是所有問題都可以找到這樣的方法繞過去.
還有一種方法是加?PRAGMA AUTONOMOUS_TRANSACTION;
[sql]?view plaincopy這樣也可以執行成功。
AUTONOMOUS_TRANSACTION是指在function,procedure,trigger等subprograms中對事務進行自治管理,當在別的pl/sql block里取調用這些subprograms的時候這些subprograms并不隨著父pl/sql block的失敗而回滾,而是自己管自己commit;
注意慎用AUTONOMOUS_TRANSACTION。一個DML可能觸發很多次觸發器,因此產生了大量獨立的事務,很容易產生死鎖。
ASKTOM上對AUTONOMOUS_TRANSACTION的看法是:唯一的用途就是作審計日志,其他一概不該使用。
有人建議是取消使用觸發器,把你的業務邏輯寫到存儲過程去。
總結
以上是生活随笔為你收集整理的ORA-04091: table is mutating, trigger/function may not see it的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 转存标志是约转是什么意思
- 下一篇: 解决asp.net(C#)中 DataT