gpt4 book ai didi

oracle - 触发和约束违反中的自治事务

转载 作者:行者123 更新时间:2023-12-01 05:38:11 24 4
gpt4 key购买 nike

我遇到了一个有趣的情况,尝试使用自治事务。考虑以下情况(请注意,它不打算这样写:只是概念证明):

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

我的问题是:为什么会这样?我确定我误解了一些基本概念,但我无法理解。

在此先感谢您的帮助。

最佳答案

PRAGMA AUTONOMOUS TRANSACTION 保存上下文,打开另一个 session 并进行一些操作。提交是必须的,否则更改将丢失。您可以理解,只有在数据库中的某个块中所做的更改在此 session (自治)中才有意义。

所以,在你的触发器中你什么都不做。
那个变量 :new.changed 在另一个 session 中被“改变”了,如果我们可以在这种模式下说的话。它不会因您的更新而改变。

关于oracle - 触发和约束违反中的自治事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7470243/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com