Oracle 触发器中的pragma自治事务
我在一个表上写了一个触发器,根据条件从另一个表中删除数据。 触发器具有pragma autonomy_事务,触发器按预期工作。但是,我确实想知道将来是否会有任何问题,比如说,如果数据由多个用户/来源同时插入等等……有什么建议吗 源表t1:Oracle 触发器中的pragma自治事务,oracle,plsql,triggers,oracle11g,plsqldeveloper,Oracle,Plsql,Triggers,Oracle11g,Plsqldeveloper,我在一个表上写了一个触发器,根据条件从另一个表中删除数据。 触发器具有pragma autonomy_事务,触发器按预期工作。但是,我确实想知道将来是否会有任何问题,比如说,如果数据由多个用户/来源同时插入等等……有什么建议吗 源表t1: -------------------------------------------- | user_id | auth_name1 | auth_name2 | data | ----------------------------------------
--------------------------------------------
| 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
或引入突变表的类似机制。但是,如果是这种情况,使用自治事务通常会更糟糕,因为自治事务无法看到父事务中所做的更改,这几乎肯定会导致代码的行为与您希望的不同。感谢您的解释。我删除了pragma autonomy_事务;以及承诺;声明