source

DDL 문은 항상 암묵적 커밋을 제공합니까? 아니면 암묵적 롤백을 제공할 수 있습니까?

nicesource 2023. 7. 13. 20:55
반응형

DDL 문은 항상 암묵적 커밋을 제공합니까? 아니면 암묵적 롤백을 제공할 수 있습니까?

트랜잭션의 중간에 테이블 자르기와 같은 DDL 문을 수행하면 트랜잭션이 커밋됩니다.

저는 이것이 항상 사실인지, 정의상인지, 아니면 커밋하는 대신 트랜잭션을 롤백할 수 있는 설정이 숨겨져 있는지 궁금합니다.

감사해요.

명확하게 하려면 편집...

잘라낸 후 롤백할 생각은 없습니다.이미 수행된 명령문은 항상 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

따라서 암묵적 커밋을 방지하려면 지연된 제약 조건이 있는 더미 테이블을 사용합니다.위반 행을 삽입하면 해당 위반이 해결될 때까지 트랜잭션을 커밋할 수 없습니다(예: 행 삭제).

잘라내기 테이블, 다른 테이블 또는 만들기 테이블은 항상 커밋을 발생시킵니다.

잘라내기 테이블을 수행할 때 롤백하려는 이유는 무엇입니까?

다음은 도움이 될 수 있는 AskTom 기사입니다.기사에서:

"DDL 문이 (시퀀스처럼) 자동 트랜잭션 내에서 실행되지 않아서 보류 중인 사용자 트랜잭션에 영향을 미치지 않는 이유가 궁금합니다.

명확하게 말씀해 주시겠습니까?

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

그런 식으로 하지 않는 것만큼 "무섭다"고 할 수 있습니다.어쨌든, 당신은 트랜스가 있으니 당신이 원한다면, 당신은 할 수 있습니다."

필요하다면 DDL을 Autonomous Transaction 안에 넣고 원하는 대로 할 수 있습니다.

편집: 결론은 Oracle을 "전환"하기 위해 명시적인 길이로 가지 않는 한 DDL이 커밋을 수행한다는 것입니다.즉, 특정 시점에 커밋을 수행해야 한다면 명시적으로 수행하는 것이 어떻습니까?

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

서버 측에서 오류가 발생한 경우 롤백하도록 하려면 오류를 나타내는 특정 플래그를 설정하고 적절한 작업을 수행할 수 있습니다.

예: 테이블1을 작성한 경우.동시에 다른 테이블에 레코드를 삽입합니다.

그러나 특정 이유(set flag=true)로 인해 삽입에 실패했습니다.그런 다음 create 문이 addl 문이므로 롤백할 수 없으므로 플래그 값에 따라 Drop 문으로 테이블(table1)을 삭제하여 데이터베이스의 변경 내용을 취소할 수 있습니다.

저는 자율적인 거래에 대해 DCookie와 Tom의 의견에 동의합니다.저는 이것도 말하려고 했습니다.

의사 코드 예제:

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

하지만 저는 이것이 그다지 유용하다고 생각하지 않습니다.초기 DML과 DDL이 동일한 테이블/오브젝트를 터치하면 작동하지 않습니다.DDL을 수행하려고 하면 경합이 발생합니다.마치 두 개의 거래가 서로를 차단하는 것처럼.그리고 만약 그것들이 독립적인 개체라면, 저는 실행 명령이 왜 중요한지 이해하지 못할 것 같습니다.

"강합니다항상/절대"가 너무 강합니다.를 들어, "DDL"과 같은 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<>디플 데모

언급URL : https://stackoverflow.com/questions/730621/do-ddl-statements-always-give-you-an-implicit-commit-or-can-you-get-an-implicit

반응형