복붙노트

[SQL] 마 DDL 문은 항상 당신에게 커밋 암시를 제공하거나 암시 롤백을받을 수 있나요?

SQL

마 DDL 문은 항상 당신에게 커밋 암시를 제공하거나 암시 롤백을받을 수 있나요?

당신은 거래를 통해 중간이고 그런 다음, 트랜잭션 커밋 테이블을 절단 등의 DDL 문을 수행합니다.

나는 이것이 항상 사건이었다 및 정의에 의해, 또는 짓는 대신 트랜잭션을 롤백 유용한 설정 숨겨진 곳이 있는지 궁금 해서요.

감사.

편집 명확하게 ...

나는 잘라 내기 후 롤백을 찾는 게 아니에요. 난 그냥 이미 수행 문이 절대적으로 항상 DDL 전에 최선을 다하고 될 것임을 확인합니다. 그냥 확실히 누군가가 내 코드를 난파 설정할 수있는 시스템 프로퍼티 곳이없는 만들고 싶어.

나는 전에하고 DDL 후 커밋 할 필요성을 이해하지만 개념적으로 나는 같은 일관성 요구 사항은 DDL 전에 롤백을 달성 할 수 있다고 생각 한 것과는 후 커밋합니다.

해결법

  1. ==============================

    1.아니, 항상 커밋됩니다.

    아니, 항상 커밋됩니다.

    당신이 롤백하려는 경우 DDL 전에해야 할 것이다.

    기존 거래에서 DDL을 분리 할 경우에, 당신은 '자신의, 별도의 트랜잭션에서 실행해야합니다.

  2. ==============================

    2.기술적으로 DDL은 그것을 실행하기 전에 커밋이 실행 된 후 않습니다.

    기술적으로 DDL은 그것을 실행하기 전에 커밋이 실행 된 후 않습니다.

    예 쿠키에서 동일한 링크는하지만,이 같은 문제의 다른 측면이다. 단지 하나의 커밋 아니라 이해하는 것이 매우 중요입니다,이 두 가지 그들은 직전과 직후에 발생합니다.

  3. ==============================

    3.사실은 IF IT CAN을 커밋합니다. 성공적으로 커밋 할 수없는 경우 DDL이 실패합니다. 커밋을 중지하는 한 가지 방법은 이연 제약 조건 위반이됩니다.

    사실은 IF IT CAN을 커밋합니다. 성공적으로 커밋 할 수없는 경우 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
    

    그래서 당신은, 암시를 방지하려면 커밋 경우 이연 제약과 더미 테이블이있다. 그것의 위반 행을 삽입하고 그 위반이 해결 될 때까지 확실 트랜잭션이 커밋 할 수없는 만들 수 있습니다 (예를 들어, 행 삭제).

  4. ==============================

    4.커밋 원인 테이블 잘라 내기 또는 ALTER 테이블이나 테이블을 만들 수는 항상.

    커밋 원인 테이블 잘라 내기 또는 ALTER 테이블이나 테이블을 만들 수는 항상.

    왜 당신이 테이블 잘라 내기 작업을 수행 할 때 롤백 하시겠습니까?

  5. ==============================

    5.여기에 도움을 수있는 AskTom 기사입니다. 기사 출처 :

    여기에 도움을 수있는 AskTom 기사입니다. 기사 출처 :

    "(시퀀스처럼) DDL 문이 자율 트랜잭션 내에서 실행되지 않는 이유가 보류중인 사용자 트랜잭션에 영향을 미칠 난 인터뷰 그래서 내가 궁금 해서요 ...

    당신은 명확 수 있습니까?

    2003년 6월 24일 후속 - 오전 7시 미국 / 동부를 :

    그는 그런 식으로 일을하지 "혼란"로 될 것입니다. 당신이, 당신이 할 수 원하는 경우 어쨌든, 그렇게 ATRANS 있습니다. "

    당신이 정말로 필요 경우에 따라서, 당신은 자율 트랜잭션 내부 사용자의 DDL 스틱과 당신이 원하는 것을 할 수 있습니다.

    편집하다: 결론은 "파괴"오라클에 명시 적 길이로 이동하지 않는 한, DDL은 커밋을 수행 할 것입니다 것입니다. 그것은 당신이 절대적으로 특정 시점에서 수행 커밋이 필요한 경우, 왜 그냥 명시 적으로 수행했다?

  6. ==============================

    6.DDL 문은 항상 실행 후 자동 COMMIT를 수행합니다.

    DDL 문은 항상 실행 후 자동 COMMIT를 수행합니다.

    당신이 (서버 측에서) 실패하는 경우 롤백 할 경우에, 당신은 실패를 표시하고 적절한 조치를 취할 특정 플래그를 설정할 수 있습니다.

    예를 들면 : 당신은 테이블 표를 만든 경우. 동시에 다른 테이블의 레코드를 삽입한다.

    그러나이 경우, 삽입으로 인해 특정 이유로 실패 (세트 플래그 = TRUE) 그 때는 당신이 드롭 문에 의해, 플래그의 값에 따라 테이블 (표) 놓는 방법으로 데이터베이스에 변경 사항을 취소 할 수 있도록 롤백으로, 문이 DDL 문입니다 만들 수 없습니다.

  7. ==============================

    7.나는 자율적 인 거래에 대한 DCookie 톰에 동의합니다. 또한이 상태로 가고 있었다.

    나는 자율적 인 거래에 대한 DCookie 톰에 동의합니다. 또한이 상태로 가고 있었다.

    예 의사 :

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

    그래도 매우 유용한 것으로이 표시되지 않습니다. 초기 DML과 DDL은 같은 테이블 / 객체를 만지면 작업에 없을거야. 당신이 DDL을 수행하려고 할 때 경합을 얻을 수 있습니다. 그냥 서로를 막고있는 두 개의 트랜잭션있다. 그들은 독립적 인 객체라면, 나는 내가 왜 실행 순서 문제가 표시되지 않습니다 같아요.

  8. ==============================

    8."항상은 / 결코"너무 강한 없습니다. 예를 들어, DDL에 대한 트랜잭션을 COMMIT되지 않습니다 오라클 18C에서 개인 임시 테이블을 CREATE처럼.

    "항상은 / 결코"너무 강한 없습니다. 예를 들어, DDL에 대한 트랜잭션을 COMMIT되지 않습니다 오라클 18C에서 개인 임시 테이블을 CREATE처럼.

    일반 시나리오 :

    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 <> 바이올린 데모

  9. from https://stackoverflow.com/questions/730621/do-ddl-statements-always-give-you-an-implicit-commit-or-can-you-get-an-implicit by cc-by-sa and MIT license