触发器中的pragma autonomous_transaction

时间:2014-05-21 05:43:28

标签: oracle plsql triggers oracle11g plsqldeveloper

我在一个表上写了一个触发器,它根据条件从其他表中删除数据。 触发器具有pragma autonomous_transaction,触发器按预期工作。但是,我想知道将来是否会出现任何问题,比如说多个用户/来源同时插入数据等等......有什么建议吗?

来源表t1:

--------------------------------------------
| user_id | auth_name1 | auth_name2 | data |
--------------------------------------------
|  1      |  Name1     |  Name2      | d1  |
|  2      |  Name3     |  Name4      | d2  |
|  3      |  Name5     |  Name1      | d3  |
--------------------------------------------

目标表t2:

   ------------------------------------------------
   | record_id |  identifier | status |   data1   |
   ------------------------------------------------
   |  100      |  Broken     |  11    |   Name1   |
   |  101      |  Reminder   |  99    |   Name1   |
   |  102      |  Broken     |  99    |   Name2   |
   |  103      |  Broken     |  11    |   Name4   |
   ------------------------------------------------

触发码:

create or replace trigger "ca"."t$t1"
    after update of auth_name1, auth_name2 on ca.t1  
    for each row
declare
    pragma autonomous_transaction;
begin
    if :new.auth_name1 is not null and :new.auth_name2 is not null then
         delete from ca.t2 ml
         where ml.identifier = 'Broken'
         and data1 = regexp_substr(:new.auth_name1, '\S+$')||' '||regexp_substr(:new.auth_name1, '^\S+')
         and status = 11;
         commit;
    end if;
end t$t1;

1 个答案:

答案 0 :(得分:11)

在父事务回滚时,将自动事务用于除日志记录以外的任何事情几乎肯定是一个错误。这不是一个很好的自治交易。

例如,如果我更新t1中的行但我的事务回滚,会发生什么情况。 t2更改已经完成并已提交,因此无法撤消。这通常意味着t2数据现在不正确。事务的整个要点是确保一组更改是原子的,并且要么完全成功,要么完全还原。允许代码部分成功几乎不是一个好主意。

我很难看到使用自动交易在这里购买的东西。您经常会看到人们错误地使用自治事务来错误地解决突变触发器错误。但是你发布的代码不会产生变异的触发错误,除非t2上的行级触发器也试图更新t1或者引入变异表的某种类似机制。如果是这种情况,那么使用自治事务通常会更糟,因为自治事务然后无法看到在父事务中进行的更改,这几乎肯定会导致代码的行为与您希望的不同。