Oracle 23c에 DDL 문이 수행하는 auto commit을 비활성화하는 기능이 추가되었습니다.
이 기능은 _kql_disable_auto_commit 파라미터와 관련이 있습니다. 이 파라미터를 TRUE로 설정하면 DDL 문 수행 전후에 자동으로 수행되는 커밋이 비활성화됩니다.
-- 1
NAME VALUE DEFAULT_VALUE DESCRIPTION
------------------------ ----- ------------- --------------------------------------
_kql_disable_auto_commit FALSE FALSE Disable DDL auto commit in the session
테스트를 위해 아래와 같이 테이블을 생성하겠습니다.
-- 2
DROP TABLE t1 PURGE;
DROP TABLE t2 PURGE;
CREATE TABLE t1 (c1 NUMBER);
CREATE TABLE t2 (c1 NUMBER);
아래 예제는 INSERT 문과 ROLLBACK 문 사이에 DDL 문인 TRUNCATE 문을 수행합니다. DDL 문의 자동 커밋에 의해 t1 테이블의 결과가 반환되는 것을 확인할 수 있습니다.
-- 3
TRUNCATE TABLE t1;
INSERT INTO t1 VALUES (1);
TRUNCATE TABLE t2;
ROLLBACK;
SELECT * FROM t1;
C1
--
1
1개의 행이 선택되었습니다.
앞선 예제의 TRUNCATE 문은 내부적으로 아래와 같이 수행됩니다.
-- 4
COMMIT;
TRUNCATE TABLE t2;
COMMIT;
_kql_disable_auto_commit 파라미터를 TRUE로 설정하고 예제를 수행하면 DDL 문의 자동 커밋이 비활성화되어 롤백에 의해 t1 테이블의 결과가 반환되지 않는 것을 확인할 수 있습니다.
-- 5
ALTER SESSION SET "_kql_disable_auto_commit" = TRUE;
TRUNCATE TABLE t1;
INSERT INTO t1 VALUES (1);
TRUNCATE TABLE t2;
ROLLBACK;
SELECT * FROM t1;
선택된 레코드가 없습니다.
DDL 문의 자동 커밋을 비활성화하고 DDL 문을 2회 이상 수행하면 에러가 발생합니다. 이런 경우 명시적으로 커밋을 수행한 후 DDL 문을 수행해야 합니다.
-- 6
DROP TABLE t1 PURGE;
CREATE TABLE t1 (c1 NUMBER);
ORA-30512: 트랜잭션에 하나 이상 TUNA.T1(를)을 수정할 수 없습니다
COMMIT;
CREATE TABLE t1 (c1 NUMBER);
테이블이 생성되었습니다.