[SQL] 마 DDL 문은 항상 당신에게 커밋 암시를 제공하거나 암시 롤백을받을 수 있나요?
SQL마 DDL 문은 항상 당신에게 커밋 암시를 제공하거나 암시 롤백을받을 수 있나요?
당신은 거래를 통해 중간이고 그런 다음, 트랜잭션 커밋 테이블을 절단 등의 DDL 문을 수행합니다.
나는 이것이 항상 사건이었다 및 정의에 의해, 또는 짓는 대신 트랜잭션을 롤백 유용한 설정 숨겨진 곳이 있는지 궁금 해서요.
감사.
편집 명확하게 ...
나는 잘라 내기 후 롤백을 찾는 게 아니에요. 난 그냥 이미 수행 문이 절대적으로 항상 DDL 전에 최선을 다하고 될 것임을 확인합니다. 그냥 확실히 누군가가 내 코드를 난파 설정할 수있는 시스템 프로퍼티 곳이없는 만들고 싶어.
나는 전에하고 DDL 후 커밋 할 필요성을 이해하지만 개념적으로 나는 같은 일관성 요구 사항은 DDL 전에 롤백을 달성 할 수 있다고 생각 한 것과는 후 커밋합니다.
해결법
-
==============================
1.아니, 항상 커밋됩니다.
아니, 항상 커밋됩니다.
당신이 롤백하려는 경우 DDL 전에해야 할 것이다.
기존 거래에서 DDL을 분리 할 경우에, 당신은 '자신의, 별도의 트랜잭션에서 실행해야합니다.
-
==============================
2.기술적으로 DDL은 그것을 실행하기 전에 커밋이 실행 된 후 않습니다.
기술적으로 DDL은 그것을 실행하기 전에 커밋이 실행 된 후 않습니다.
예 쿠키에서 동일한 링크는하지만,이 같은 문제의 다른 측면이다. 단지 하나의 커밋 아니라 이해하는 것이 매우 중요입니다,이 두 가지 그들은 직전과 직후에 발생합니다.
-
==============================
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.커밋 원인 테이블 잘라 내기 또는 ALTER 테이블이나 테이블을 만들 수는 항상.
커밋 원인 테이블 잘라 내기 또는 ALTER 테이블이나 테이블을 만들 수는 항상.
왜 당신이 테이블 잘라 내기 작업을 수행 할 때 롤백 하시겠습니까?
-
==============================
5.여기에 도움을 수있는 AskTom 기사입니다. 기사 출처 :
여기에 도움을 수있는 AskTom 기사입니다. 기사 출처 :
"(시퀀스처럼) DDL 문이 자율 트랜잭션 내에서 실행되지 않는 이유가 보류중인 사용자 트랜잭션에 영향을 미칠 난 인터뷰 그래서 내가 궁금 해서요 ...
당신은 명확 수 있습니까?
2003년 6월 24일 후속 - 오전 7시 미국 / 동부를 :
그는 그런 식으로 일을하지 "혼란"로 될 것입니다. 당신이, 당신이 할 수 원하는 경우 어쨌든, 그렇게 ATRANS 있습니다. "
당신이 정말로 필요 경우에 따라서, 당신은 자율 트랜잭션 내부 사용자의 DDL 스틱과 당신이 원하는 것을 할 수 있습니다.
편집하다: 결론은 "파괴"오라클에 명시 적 길이로 이동하지 않는 한, DDL은 커밋을 수행 할 것입니다 것입니다. 그것은 당신이 절대적으로 특정 시점에서 수행 커밋이 필요한 경우, 왜 그냥 명시 적으로 수행했다?
-
==============================
6.DDL 문은 항상 실행 후 자동 COMMIT를 수행합니다.
DDL 문은 항상 실행 후 자동 COMMIT를 수행합니다.
당신이 (서버 측에서) 실패하는 경우 롤백 할 경우에, 당신은 실패를 표시하고 적절한 조치를 취할 특정 플래그를 설정할 수 있습니다.
예를 들면 : 당신은 테이블 표를 만든 경우. 동시에 다른 테이블의 레코드를 삽입한다.
그러나이 경우, 삽입으로 인해 특정 이유로 실패 (세트 플래그 = TRUE) 그 때는 당신이 드롭 문에 의해, 플래그의 값에 따라 테이블 (표) 놓는 방법으로 데이터베이스에 변경 사항을 취소 할 수 있도록 롤백으로, 문이 DDL 문입니다 만들 수 없습니다.
-
==============================
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."항상은 / 결코"너무 강한 없습니다. 예를 들어, 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 <> 바이올린 데모
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
'SQL' 카테고리의 다른 글
[SQL] 커밋 된 트랜잭션을 롤백 (0) | 2020.06.30 |
---|---|
[SQL] 한 번에 여러 SQL 문을 실행 MyBatis로, 그 수 있습니까? (0) | 2020.06.30 |
[SQL] 그것은 모니터링하고 액세스 MDB에 의해 만들어진 실제 쿼리를 기록 할 수 있습니까? (0) | 2020.06.30 |
[SQL] 나는 특정 테이블에 MySQL 사용자를 제한 할 수있는 방법 (0) | 2020.06.30 |
[SQL] 어떻게 두 개의 테이블을 조인 할 수 있지만 일치하지 않는 행을 반환? (0) | 2020.06.30 |