ORA-04091: table is mutating, trigger/function may not see it
今天在論壇里發(fā)現(xiàn)了一個(gè)關(guān)于ORA-04091的老帖子,收獲良多,特此整理一下
關(guān)于ORA-04091: table is mutating, trigger/function may not see it的分析
當(dāng)DML操作觸發(fā)trigger的時(shí)候,如果trigger的程序塊中需要對(duì)當(dāng)前表進(jìn)行修改或查詢的時(shí)候,就會(huì)報(bào)錯(cuò)
ORA-04091: table is mutating, trigger/function may not see it
這是有在被觸發(fā)TRIGGER工作的時(shí)候,默認(rèn)把當(dāng)前表表鎖死,不允許對(duì)其進(jìn)行操作,所以trigger包含對(duì)當(dāng)前表的DML操作就會(huì)報(bào)錯(cuò),那怎么辦?最常用的方法是通過(guò)修改SQL避免錯(cuò)誤.
[sql]?view plaincopy
這就是個(gè)典型的錯(cuò)誤的例子,肯定會(huì)報(bào)錯(cuò)ORA-04091,這個(gè)trigger是為了修改新插入的行的某列,因?yàn)椴迦牒螽?dāng)前表已經(jīng)被鎖死了,所以根本沒(méi)有辦法update,所以報(bào)錯(cuò)。
那應(yīng)該怎么改呢?
[sql]?view plaincopy在出入前就修改好要修改的值,就不會(huì)報(bào)錯(cuò)了
但是這種方法浪費(fèi)時(shí)間精力,更重要的并不是所有問(wèn)題都可以找到這樣的方法繞過(guò)去.
還有一種方法是加?PRAGMA AUTONOMOUS_TRANSACTION;
[sql]?view plaincopy這樣也可以執(zhí)行成功。
AUTONOMOUS_TRANSACTION是指在function,procedure,trigger等subprograms中對(duì)事務(wù)進(jìn)行自治管理,當(dāng)在別的pl/sql block里取調(diào)用這些subprograms的時(shí)候這些subprograms并不隨著父pl/sql block的失敗而回滾,而是自己管自己commit;
注意慎用AUTONOMOUS_TRANSACTION。一個(gè)DML可能觸發(fā)很多次觸發(fā)器,因此產(chǎn)生了大量獨(dú)立的事務(wù),很容易產(chǎn)生死鎖。
ASKTOM上對(duì)AUTONOMOUS_TRANSACTION的看法是:唯一的用途就是作審計(jì)日志,其他一概不該使用。
有人建議是取消使用觸發(fā)器,把你的業(yè)務(wù)邏輯寫到存儲(chǔ)過(guò)程去。
總結(jié)
以上是生活随笔為你收集整理的ORA-04091: table is mutating, trigger/function may not see it的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 转存标志是约转是什么意思
- 下一篇: jquery 里面对数组去重操作-uni