向表中插入数据时,表上有触发器,爆出如下错误:
ora-04091 table TASK_FLOW_LOG is mutating, trigger/function may not see it这是我的触发器create or replace trigger "TRG_TASK_FLOW_LOG"
  before insert on task_flow_log
  for each row
declare
  I_count integer;
  data_unique_exception exception;
begin  if :new.seq is null then
    raise data_unique_exception;
  end if;----如果还在待审核状态,不能做其他插入操作
  select count(1)
    into I_count
    from task_flow_log
   where task_info_id = :new.task_info_id   --这句select报错
     and state = 'T0';
  if I_count > 0 then
    raise data_unique_exception;
  end if;
end TRG_TASK_FLOW_LOG;这是我的insert语句。insert into task_flow_log values ('AUTO',14776306,3,'08300002',sysdate,sysdate,1,5);目前找到的解决方法是修改触发器,添加如下语句,但是这种做法可能会导致死锁。
PRAGMA AUTONOMOUS_TRANSACTION;有没有高手还有更好的方法。
为什么web程序每天插都没事,我在plsql中插入一条就报这个错误呢。这个问题希望高手也能解答下。

解决方案 »

  1.   

    个人认为,触发器这个问题,确实比较让人头疼。
    PRAGMA AUTONOMOUS_TRANSACTION
    是增加了一个内部的自治事务,原则上来说,不是太好,毕竟中间该提交的,该返回的,都做完了,外边的事务控制不了。
    其实就楼主这个需求来讲,不用触发器,也比较容易实现,那就是,插入之前,去数据库select一次,看看。