문서유형ㅣ기술정보
분야ㅣ인터페이스/연동
문서번호ㅣTIITI025
개요
Oracle에서 Tibero로의 DBLink에서 다수의 DML이 하나의 프로시저에 존재할 경우, 독립적으로 Commit 또는 Rollback 되도록 트랜잭션을 관리하는 방안을 안내합니다.
주의본 문서에서 안내하는 기능은 프로시저 내에서 오류가 발생해도 Commit 또는 Rollback을 수행합니다.해당 기능 사용 시 프로시저의 트랜잭션 단위가 독립되어, 데이터 정합성이 깨질 가능성이 존재합니다.
방법
‘PRAGMA AUTONOMOUS_TRANSACTION’를 사용해 해당 문장이 포함된 프로시저가 독립적으로 Commit 또는 Rollback 될 수 있도록 적용 합니다.
1. 테스트 테이블 생성
Oracle
CREATE TABLE T8_ORA (CD CHAR(1),CD_NO NUMBER, TEXT VARCHAR2(20)); CREATE TABLE T9_ORA (CD CHAR(1),CD_NO NUMBER, TEXT VARCHAR2(20)); CREATE TABLE T10_ORA (CD CHAR(1),CD_NO NUMBER, TEXT VARCHAR2(20)); INSERT INTO T8_ORA VALUES (‘A’,1,’ORACLE1′); INSERT INTO T8_ORA VALUES (‘B’,1,’ORACLE1′); INSERT INTO T8_ORA VALUES (‘C’,1,’ORACLE1′); COMMIT; INSERT INTO T9_ORA VALUES (‘A’,1,’ORACLE2′); INSERT INTO T9_ORA VALUES (‘E’,1,’ORACLE2′); INSERT INTO T9_ORA VALUES (‘F’,1,’ORACLE2′); COMMIT; INSERT INTO T10_ORA VALUES (‘G’,1,’ORACLE3′); INSERT INTO T10_ORA VALUES (‘H’,1,’ORACLE3′); INSERT INTO T10_ORA VALUES (‘I’,1,’ORACLE3′); COMMIT; TRUNCATE TABLE T9_ORA;
Tibero
CREATE TABLE T7_TIB (CD CHAR(1) , CD_NO NUMBER , TEXT VARCHAR(20)); CREATE TABLE T8_TIB (CD CHAR(1) , CD_NO NUMBER , TEXT VARCHAR(20)); INSERT INTO T8_TIB VALUES (‘C’,2,’TIBERO’); INSERT INTO T8_TIB VALUES (‘C’,2,’TIBERO2′); INSERT INTO T8_TIB VALUES (‘C’,2,’TIBERO3′)
2. 우회 전 쿼리
DECLARE
BEGIN
FOR I IN (SELECT * FROM T8_ORA)
LOOP
INSERT INTO T7_TIB@OT_0627 VALUES (I.CD, I.CD_NO,I.TEXT);
END LOOP;
FOR I2 IN (SELECT * FROM T9_ORA)
LOOP
INSERT INTO T7_TIB@OT_0627 VALUES (I2.CD, I2.CD_NO,I2.TEXT);
END LOOP;
FOR I3 IN (SELECT * FROM T10_ORA)
LOOP
INSERT INTO T7_TIB@OT_0627 VALUES (I3.CD, I3.CD_NO,I3.TEXT);
END LOOP;
FOR I4 IN (SELECT A.CD , B.CD_NO,B.TEXT FROM T8_ORA A, T8_TIB@OT_0627 B WHERE A.CD=B.CD)
LOOP
UPDATE T7_TIB@OT_0627 A
SET A.CD = ‘A’
WHERE A.CD = I4.CD;
END LOOP;
COMMIT;
END;
/참고
UPDATE 부분에서 예외 발생후 02055 오류가 발생합니다.분산 트랜잭션에 의한 업데이트를 허용하지 않습니다.
3. 우회 후 쿼리
CREATE OR REPLACE PROCEDURE SP_GET_UPDATE
AS
BEGIN
FOR I4 IN (SELECT A.CD , B.CD_NO,B.TEXT FROM T8_ORA A, T8_TIB@OT_0627 B WHERE A.CD=B.CD)
LOOP
UPDATE T7_TIB@OT_0627 A
SET A.CD = ‘Z’
WHERE A.CD = I4.CD;
END LOOP;
COMMIT;
END;
CREATE OR REPLACE PROCEDURE FN_DIS_TEST
AS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
FOR I IN (SELECT * FROM T8_ORA)
LOOP
INSERT INTO T7_TIB@OT_0627 VALUES (I.CD, I.CD_NO,I.TEXT);
END LOOP;
FOR I2 IN (SELECT * FROM T9_ORA)
LOOP
INSERT INTO T7_TIB@OT_0627 VALUES (I2.CD, I2.CD_NO,I2.TEXT);
END LOOP;
FOR I3 IN (SELECT * FROM T10_ORA)
LOOP
INSERT INTO T7_TIB@OT_0627 VALUES (I3.CD, I3.CD_NO,I3.TEXT);
END LOOP;
SP_GET_UPDATE;
COMMIT;
END;
/참고
마지막 UPDATE 부분을 프로시저로 분리 후 본 프로시저를 자율 트랜잭션에 맡깁니다.