触发器中的 pragmaautonomous_transaction

2023-12-03

我在一个表上编写了一个触发器,该触发器根据条件从其他表中删除数据。 触发器具有 pragmaautonomous_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;

将自治事务用于除父事务回滚时希望保留的日志记录以外的任何事务几乎肯定是一个错误。这不是自治事务的良好用途。

例如,如果我更新一行,会发生什么情况t1但我的交易回滚了。这t2更改已经进行并提交,因此不会回滚。这通常意味着t2现在数据不正确。事务的重点是确保一组更改是原子的,并且完全成功或完全恢复。允许代码部分成功几乎从来都不是一个好主意。

我很难想象使用自主交易会给你带来什么。您经常会看到人们错误地使用自主事务来错误地解决变异触发错误。但是您发布的代码不会生成变异触发器错误,除非存在行级触发器t2也正在尝试更新t1或引入变异表的类似机制。但如果是这种情况,使用自治事务通常会更糟,因为自治事务无法看到父事务中所做的更改,这几乎肯定会导致代码的行为与您期望的不同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

触发器中的 pragmaautonomous_transaction 的相关文章

随机推荐