我遇到了一个有趣的情况,正在尝试使用自主事务。考虑以下情况(请注意,这不是打算这样编写的:只是概念证明):
create table t
(
id int primary key,
changed date
)
/
create or replace trigger t_trig
before insert or update
on t
for each row
declare
PRAGMA AUTONOMOUS_TRANSACTION;
begin
:new.changed := sysdate;
commit;
end;
/
insert into t(id, changed) values (1, sysdate);
insert into t(id, changed) values (2, sysdate);
当前时间的修改日期:
SQL> select * from t;
ID CHANGED
--------- -----------------
1 19.09.11 15:29:44
2 19.09.11 15:32:35
让我们休息5秒,然后做以下操作:
update t set id = 2 where id = 1;
显然,由于约束违规,它将失败,但它也不会改变changed
属性:
SQL> select * from t;
ID CHANGED
--------- -----------------
1 19.09.11 15:29:44
2 19.09.11 15:32:35
我的问题是:为什么会发生这种情况?我确定我对一些基本概念有误解,但我无法理解这个想法。
提前感谢您的帮助。