이전 포스팅에서 Oracle에서 로그 데이터를 조회하는 방법부터 실제 Spring Batch에서 불러오는 방법까지의 과정에 대해서 다뤘었습니다.
이전 포스팅은 아래 글을 참고해 주시기 바랍니다.
https://hyunily.tistory.com/44
해당 과정에서 사용했던 로그 데이터를 읽어오는 쿼리문은 다음과 같았습니다.
SELECT OPERATION, SEG_OWNER, TABLE_NAME, SQL_REDO FROM V$LOGMNR_CONTENTS WHERE TABLE_NAME = 'INTERACTION';
그럼 여기서 한번 생각해볼 수 있는 의문점은 다음과 같은 게 있습니다.
1. 트랜잭션 단위의 Commit되지 않은 DML문은 로그에 쌓이는가?
2. 만약 쌓인다면, ACTIVE 상태인 트랜잭션에 대한 로그는 어떻게 처리해야 하는가?
오늘 이 2가지 의문점에 대해서 다뤄보겠습니다.
문제 1. 트랜잭션 단위의 Commit되지 않은 DML문은 로그에 쌓이는가?
이 부분을 확인하기 위해서 직접 DML문을 실행하고, Commit을 하지 않은 상태로 로그를 확인해 보겠습니다.
DML 실행하기
각자 사용하고 있는 테이블에 데이터를 추가하겠습니다.
INSERT INTO INTERACTION VALUES (NULL, 4, 7, 2);
Redo 로그 확인
Oracle에서는 강력한 트랜잭션 관리 기능을 제공하며, 기본적으로 자동 커밋이 비활성화된 상태에서 동작합니다.
그래서 DML문을 실행해서 데이터에 변경사항을 주더라도, Commit 또는 Rollback 전에는 데이터 변경 사항이 다른 사람한테는 보이지 않습니다.
이 부분을 인지한 상태에서 로그 파일 내용을 확인해 보겠습니다.
위에서 사용했던 조회문을 그대로 실행합니다.
결과를 확인하면, Commit을 진행하지 않았지만 로그는 쌓이는 모습을 볼 수 있습니다.
V&TRANSACTION View 확인
이렇게 Commit되지 않은 로그의 트랜잭션은 아래 쿼리문으로 확인할 수 있습니다.
SELECT * FROM V$TRANSACTION WHERE STATUS = 'ACTIVE';
V&TRANSACTION View는 오라클 데이터베이스에서 현재 실행 중인 트랜잭션에 대한 상태 및 세부 정보를 제공하는 가상 테이블입니다.
아직 Commit되지 않은 상태이기에 STATUS를 확인해 보면 ACTIVE인걸 확인할 수 있고, 해당 트랜잭션의 XIDUSN과 XIDSLOT값은 위 로그에 쌓인 Insert문의 XIDUSN과 XIDSLT값과 동일합니다.
이렇게 트랜잭션이 ACTIVE 상태일때, 로그에 쌓여있는 데이터를 기반으로 만약 실 데이터를 조회하려 한다면 오류가 발생하게 될 것입니다.
그럼 이 부분을 예외처리를 진행해서 조회해야 된다는 점을 깨달을 수 있습니다.
문제 2. ACTIVE 상태인 트랜잭션에 대한 로그는 어떻게 처리해야 하는가?
그럼 초기에 로그 파일로부터 데이터를 조회할 때 동일한 값을 담고 있었던 XIDUSN과 XIDSLT 값을 활용해서 uncommitted DML 로그는 제외하고 조회하게 할 수 있습니다.
이러한 내용을 담은 쿼리문은 아래와 같습니다.
SELECT OPERATION, SEG_OWNER, TABLE_NAME, SQL_REDO, XIDUSN, XIDSLT FROM V$LOGMNR_CONTENTS WHERE TABLE_NAME = 'INTERACTION' AND (XIDUSN, XIDSLT) NOT IN (SELECT XIDUSN, XIDSLOT FROM V&TRANSACTION WHERE STATUS = 'ACTIVE');
쿼리 수정을 통해 uncommited DML에 대해서 예외처리를 진행해 주었고, 데이터 일관성에 대한 문제를 해결할 수 있습니다.
이번 포스팅에서는 로그를 읽어오는 과정에서 발생할 수 있는 여러 문제 중 하나인 트랜잭션 단위 문제에 대해서 다뤄봤습니다.
트랜잭션 단위 문제뿐만 아니라, 다른 문제들도 여전히 존재하고 있습니다.
다른 문제들에 대해서는 다음 포스팅에서 짚고 넘어가겠습니다.
'Daily' 카테고리의 다른 글
[CDC 프로젝트] Skip한 Active Transaction Data 후처리 (0) | 2025.01.29 |
---|---|
[CDC 프로젝트] Offset을 활용한 로그 읽기 (0) | 2025.01.21 |
[CDC 프로젝트] Oracle DB to MySQL(1) (1) | 2025.01.04 |
Scanner vs BufferedReader (1) | 2024.12.19 |
CDC(Change Data Capture)란? (0) | 2024.12.09 |