2011-09-19 2 views
4

autonomous_transaction을 실험하는 흥미로운 상황이 있습니다. 다음과 같은 상황을 고려 (이이 방법을 쓸 수 없습니다 주하십시오 개념의 단지 증거) :트리거 및 제약 조건 위반시 autonomous_transaction

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 

내 질문에 : 왜 이런 일이 발생합니까? 나는 몇 가지 기본 개념을 오해하고 있지만 그 아이디어를 얻을 수는 없다고 확신한다.

미리 도움을 주셔서 감사합니다.

답변

1

PRAGMA AUTONOMOUS TRANSACTION은 컨텍스트를 저장하고 다른 세션을 열고 뭔가를 만듭니다. 커밋은 필수 항목입니다. 그렇지 않으면 변경 내용이 손실 될 수 있습니다. 이 세션에서는 데이터베이스의 일부 블록에서 변경된 내용 만 (자율적으로) 이해할 수 있습니다.

그래서 트리거에서 아무 것도하지 않습니다. 그 변수 : new.changed는 다른 세션에서이 모드로 말할 수 있다면 "변경"됩니다. 업데이트를 위해 변경되지 않습니다.