DDL 진술은 항상 당신에게 암묵적 커밋을 제공합니까, 아니면 암시 적 롤백을 얻을 수 있습니까?

StackOverflow https://stackoverflow.com/questions/730621

  •  06-09-2019
  •  | 
  •  

문제

트랜잭션 중간에 중간에 테이블을 자르고 DDL 명령문을 수행하는 경우 트랜잭션이 저지릅니다.

나는 이것이 항상 사건인지, 정의에 따라, 아니면 어딘가에 숨겨져있는 설정이 있는지 궁금합니다. 롤백 커밋 대신 거래.

감사.

명확히하기 위해 편집 ...

나는 잘린 후 롤백을 원하지 않습니다. 이미 수행 된 진술이 절대적으로 항상 DDL 전에 커밋 될 예정입니다. 누군가가 내 코드를 망칠 수있는 시스템 속성이 없는지 확인하고 싶습니다.

DDL 전후에 커밋해야 할 필요성을 이해하지만 개념적으로 동일한 일관성 요구 사항을 생각했을 것입니다. ~할 수 있었다 DDL 전에 롤백으로 달성하고 커밋 후에 달성하십시오.

도움이 되었습니까?

해결책

아니요, 항상 커밋 할 것입니다.

롤백을 원한다면 DDL 전에해야합니다.

기존 트랜잭션에서 DDL을 격리하려면 '자체, 별도의 트랜잭션으로 실행해야합니다.

다른 팁

기술적으로 DDL 실행 전과 실행 후 커밋을 수행합니다.

예, 쿠키와 동일한 링크이지만 이것은 같은 문제의 다른 측면입니다. 하나의 커밋이 아니라 두 가지가 있고 직전과 직후에 일어난다는 것을 이해하는 것이 중요합니다.

실제로 가능하다면 커밋 할 것입니다. 성공적으로 커밋 할 수 없으면 DDL이 실패합니다. 커밋을 막는 한 가지 방법은 지연된 제약을 위반하는 것입니다.

create table fred (id number);
alter table fred add constraint id_ck check (id >0) initially deferred;
insert into fred values (-1);
SQL> create table junk(val number);
create table junk(val number)
*
ERROR at line 1:
ORA-02091: transaction rolled back
ORA-02290: check constraint (GC_REF.ID_CK) violated
SQL> desc junk
ERROR:
ORA-04043: object junk does not exist

따라서 암시 적 커밋을 방지하려면 연기 된 제약 조건이있는 더미 테이블을 가지고 있습니다. 위반 행을 삽입하면 위반이 해결 될 때까지 (예 : 행 삭제)까지 거래를 커밋 할 수 없도록 할 수 있습니다.

절단 테이블 또는 변경 테이블 또는 a 테이블을 만듭니다 항상 커밋을 일으킨다.

잘린 테이블을 할 때 왜 롤백을 원하십니까?

여기 도움이 될 수있는 Asktom 기사입니다. 기사에서 :

"DDL 명세서가 왜 자율 트랜잭션 내부에서 실행되지 않는지 궁금해서 (시퀀스와 마찬가지로) 보류중인 사용자 트랜잭션에 영향을 미치지 않습니다 ...

명확히 할 수 있습니까?

2003 년 6 월 24 일부터 오전 7시/동부 : 후속 : 동부 :

그것은 그렇게하지 않는 것처럼 "혼란스러운"것입니다. 어쨌든, 당신은 Atrans가 있으므로 원한다면 할 수 있습니다. "

따라서 실제로 필요한 경우 DDL을 자율 트랜잭션 내에 고정하고 원하는 것을 수행 할 수 있습니다.

편집 : 결론은 Oracle을 "전복"하기 위해 명시적인 길이로 이동하지 않으면 DDL이 커밋을 수행한다는 것입니다. 즉, 특정 지점에서 커밋이 수행되도록 절대적으로 요구한다면, 명시 적으로 수행하지 않겠습니까?

DDL 문은 실행 후 항상 자동 커밋을 수행합니다.

실패의 경우 (서버 측에서) 롤백을 원한다면, 고장을 나타내고 적절한 조치를 취하도록 특정 플래그를 설정할 수 있습니다.

EG : 표 1을 만든 경우. 그리고 동시에 다른 테이블에 레코드를 삽입하고 있습니다.

그러나 특정 이유 (set flag = true)로 인해 삽입이 실패했습니다.이 경우 Create 문으로 롤백 할 수는 없으므로 DDL 문자이므로에 따라 테이블 (표 1)을 삭제하여 데이터베이스의 변경 사항을 취소 할 수 있습니다. 낙하 문으로 깃발의 값.

나는 자율적 거래에 대해 Dcookie와 Tom에 동의합니다. 나는 이것을 진술하려고했다.

Pseudocode 예제 :

Do some DML
Call autonomous function, that performs DDL
Do some more DML
rollback or commit all the DML - your choice

나는 이것이 매우 유용하다고 생각하지 않습니다. 초기 DML과 DDL이 동일한 테이블/객체에 터치하면 작동하지 않습니다. DDL을 수행하려고 할 때 경합이됩니다. 서로를 차단하는 두 거래와 마찬가지로. 그리고 그것들이 독립적 인 객체라면, 실행 순서가 왜 중요한지 모르겠습니다.

"항상/never"는 너무 강합니다. 예를 들어 DDL 좋아요 CREATE PRIVATE TEMPORARY TABLE Oracle 18C에서는 그렇지 않습니다 COMMIT 거래.

일반 시나리오 :

CREATE TABLE t(i INT);
INSERT INTO t(i) VALUES(21);

CREATE TABLE x(i INT);   -- same for CREATE GLOBAL TEMPORARY TABLE y(i INT); 
ROLLBACK;

SELECT * FROM t;
-- Output:
-- 21

그러나 개인 테이블을 작성하는 경우 :

CREATE TABLE t(i INT);
INSERT INTO t(i) VALUES(21);

CREATE PRIVATE TEMPORARY TABLE ORA$PTT_temp(i INT);  
-- or
CREATE PRIVATE TEMPORARY TABLE ORA$PTT_tab
AS
SELECT 1 AS c FROM dual;

ROLLBACK;
SELECT * FROM t;
-- Output:
-- no data found

DB <> 바이올린 데모

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top