【问题标题】:autonomous_transaction in trigger and constraint violation触发和约束冲突中的自治事务
【发布时间】:2011-11-20 04:17:27
【问题描述】:

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

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

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

提前感谢您的帮助。

【问题讨论】:

    标签: oracle transactions triggers constraints


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-03-05
      • 2020-04-17
      • 1970-01-01
      • 2015-01-02
      • 1970-01-01
      • 1970-01-01
      • 2014-07-09
      • 2011-01-31
      • 1970-01-01
      相关资源
      最近更新 更多