触发器中的pragma autonomous_transaction

Jaa*_*nna 4 oracle triggers plsql 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  |
--------------------------------------------
Run Code Online (Sandbox Code Playgroud)

目标表t2:

   ------------------------------------------------
   | record_id |  identifier | status |   data1   |
   ------------------------------------------------
   |  100      |  Broken     |  11    |   Name1   |
   |  101      |  Reminder   |  99    |   Name1   |
   |  102      |  Broken     |  99    |   Name2   |
   |  103      |  Broken     |  11    |   Name4   |
   ------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

触发代码:

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;
Run Code Online (Sandbox Code Playgroud)

Jus*_*ave 11

在父事务回滚时使用自动事务处理除要记录之外的任何事情几乎肯定是一个错误.这不是自治交易的良好用途.

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

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