【问题标题】:Oracle trigger is giving error - active autonomous transaction detected and rolled backOracle 触发器给出错误 - 检测到并回滚活动的自主事务
【发布时间】:2021-09-03 02:02:19
【问题描述】:

我写了一个触发器,它在最后调用一个过程,过程有一个提交语句。 当我执行触发器时,它给了我错误“无法在触发器中提交”。 然后我声明了 PRAGAMA AUTONOMUS_TRANSACTION 但这也给出了错误“检测到并回滚了主动自治事务”,“触发器执行期间出错”

 CREATE OR REPLACE TRIGGER  Test_Ord_Update   
    AFTER  
    insert or update on test1  
    for each row  
    
    declare
      PRAGMA AUTONOMOUS_TRANSACTION;
      l_exst number(1);
      v_id NUMBER (5);
    begin
    
     merge into test2 b
            USING dual a
            on (:new.id = b.id)
            when matched then update set
              b.price1 = :new.price1,
             b.price2 = :new.price2
           when not matched then insert (id, price1, price2)
             values (:new.id, :new.price1, :new.price2);
          select id into v_id from test2 where price1 =  :new.price1;
          LOAD_PRICE(v_id);
    end;

【问题讨论】:

  • 您永远不会在触发器中提交或回滚。执行工作的会话需要执行提交或回滚
  • 自治事务在新的会话中执行,到最后(执行回到当前会话时)还没有完成(提交或回滚)。这就是甲骨文所说的。查看9i docs了解更多详情
  • 你应该检查自治事务的概念。它具有孤立的上下文,因此它对主程序一无所知。要么在自治事务中提交,要么根本不使用它
  • 使用自治事务处理日志以外的事情几乎可以肯定是一个错误。例如,您是否意识到执行insert 的会话现在可以回滚他们的事务并且您的触发器和存储过程所做的更改不会被回滚?因此表中的数据将不同步。或者如果load_price 过程查询test1 它将看到以前的值而不是导致触发器触发的更改值?

标签: oracle triggers


【解决方案1】:

每当我们在具有提交语句的触发器中调用子程序时,我们必须在调用子程序的那一行之后写一个提交。如下所示

创建或替换触发器 Test_Ord_Update
之后
在 test1 上插入或更新
每一行

declare
  PRAGMA AUTONOMOUS_TRANSACTION;
  l_exst number(1);
  v_id NUMBER (5);
begin

 merge into test2 b
        USING dual a
        on (:new.id = b.id)
        when matched then update set
          b.price1 = :new.price1,
         b.price2 = :new.price2
       when not matched then insert (id, price1, price2)
         values (:new.id, :new.price1, :new.price2);
      select id into v_id from test2 where price1 =  :new.price1;
      LOAD_PRICE(v_id);
      COMMIT;
end;

【讨论】:

  • 如上述 cmets 所述,这很可能会导致数据损坏。
猜你喜欢
  • 1970-01-01
  • 2013-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-30
相关资源
最近更新 更多