Oracle 데이터베이스에서 데이터를 읽고 처리할 때, Consistent Mode(일관성 모드)와 Current Mode(현재 모드) 두 가지 방식이 존재합니다.
이 모드는 쿼리의 실행 방식과 데이터 일관성을 유지하는 방법에 따라 결정됩니다.
1. Consistent Mode (일관성 모드)
Consistent Mode(일관성 모드)는 쿼리 실행 시점의 일관된 데이터를 제공하는 방식입니다.
즉, 쿼리가 시작된 시점의 SCN(System Change Number, 변경 번호) 기준으로 데이터를 반환합니다.
✅ 특징
- 쿼리 실행 시점의 데이터 스냅샷을 유지
- 실행 중 트랜잭션이 다른 데이터 변경을 수행하더라도 쿼리는 변경 전 데이터(UNDO를 이용하여 재구성됨)를 반환
- 일관성 유지 (Read Consistency)
- 여러 개의 테이블을 조회하는 경우, 동일한 시간의 데이터를 기준으로 일관된 결과 제공
- UNDO를 사용하여 일관된 데이터 유지
- UPDATE, DELETE 등의 연산이 수행되면 변경 이전 데이터가 UNDO에 저장됨
- UNDO 데이터를 사용하여 쿼리 실행 시점의 데이터를 복구함
- SELECT 쿼리에서 사용
- SELECT 문은 기본적으로 Consistent Mode에서 실행됨
- 트랜잭션이 실행되더라도 쿼리가 시작된 시점의 데이터만 반환
📌 Consistent Mode 예제
✅ 다른 트랜잭션이 데이터를 변경해도 기존 데이터를 반환
-- 세션 1: 데이터 조회 (Consistent Mode)
SELECT * FROM employees WHERE emp_id = 100;
-- 세션 2: 데이터 변경 (Current Mode)
UPDATE employees SET salary = 5000 WHERE emp_id = 100;
COMMIT;
✔ 결과:
SELECT
는 변경된 데이터가 아니라 쿼리 시작 시점의 데이터(SCN 기준) 반환- 변경된 데이터(
salary = 5000
)는 이후 새로운 트랜잭션에서 조회 가능
2. Current Mode (현재 모드)
Current Mode(현재 모드)는 가장 최신 상태의 데이터를 읽고 수정하는 방식입니다.
즉, 데이터가 변경되면 가장 최신 값을 반환하며, UNDO를 사용하지 않음.
✅ 특징
- 변경된 데이터의 최신 상태를 반환
- 실행 중인 트랜잭션이 변경한 데이터가 있으면, UNDO를 거치지 않고 즉시 최신 데이터를 반환
- UNDO를 사용하지 않음
- Consistent Mode와 달리, 변경 이력이 저장된 UNDO를 이용하지 않고, 현재 블록의 최신 값을 직접 조회
- DML(INSERT, UPDATE, DELETE) 및 FOR UPDATE 문에서 사용
- UPDATE, DELETE 등의 DML 문장은 Current Mode를 사용하여 최신 데이터를 참조
SELECT ... FOR UPDATE
문장은 Current Mode로 실행되어 최신 데이터를 잠금(Locking)할 수 있음
- 변경 충돌 가능성 존재
- 여러 트랜잭션이 동시에 실행될 경우, 다른 트랜잭션에서 변경한 최신 데이터가 바로 반영됨
📌 Current Mode 예제
✅ 최신 데이터를 반영하여 업데이트
-- 세션 1: 데이터 변경
UPDATE employees SET salary = 5000 WHERE emp_id = 100;
-- 세션 2: 같은 데이터를 조회 (현재 변경된 값이 반영됨)
SELECT salary FROM employees WHERE emp_id = 100 FOR UPDATE;
✔ 결과:
SELECT ... FOR UPDATE
는 Current Mode에서 실행되므로 최신 데이터(salary = 5000
) 반환- UNDO를 사용하지 않고 현재 커밋되지 않은 데이터도 볼 수 있음
3. Consistent Mode vs. Current Mode 비교
비교 항목 | Consistent Mode (일관성 모드) | Current Mode (현재 모드) |
---|---|---|
데이터 조회 시점 | 쿼리 실행 시작 시점의 데이터 반환 (SCN 기준) | 변경된 최신 데이터 반환 |
UNDO 사용 여부 | ✅ UNDO 사용 (변경 전 데이터 조회) | ❌ UNDO 사용하지 않음 |
DML 적용 여부 | ❌ DML(UPDATE, DELETE)에는 적용되지 않음 | ✅ DML에서 사용됨 |
트랜잭션 일관성 유지 | ✅ 모든 테이블이 동일한 시점의 데이터를 반환 | ❌ 트랜잭션 변경 사항이 즉시 반영됨 |
사용되는 SQL 문 | SELECT , SELECT JOIN , SELECT WHERE | UPDATE , DELETE , SELECT ... FOR UPDATE |
변경된 최신 데이터 조회 가능 여부 | ❌ 불가능 (쿼리 시작 시점 기준) | ✅ 가능 (가장 최신 데이터 조회) |
성능 | 비교적 낮음 (UNDO 데이터 필요) | 빠름 (최신 블록 바로 조회) |
✔ 핵심 차이점
- Consistent Mode: UNDO를 사용하여 쿼리 실행 시점의 일관된 데이터를 반환 →
SELECT
문에서 기본적으로 사용됨 - Current Mode: 가장 최신 데이터 즉시 반영 →
UPDATE
,DELETE
,SELECT ... FOR UPDATE
에서 사용됨
4. Consistent Mode & Current Mode 활용 전략
✅ 읽기 일관성이 중요한 경우 (Consistent Mode 사용)
- 보고서 생성, 데이터 분석과 같이 특정 시점의 데이터를 유지해야 할 때
SELECT
문이 실행될 때 트랜잭션이 변경해도 영향을 받지 않도록 해야 하는 경우- ❗ 주의: UNDO 테이블 공간이 부족하면 ORA-01555 (Snapshot Too Old) 오류 발생 가능
📌 예제: 일관된 데이터 조회
SELECT * FROM employees WHERE department = 'IT';
✅ 최신 데이터가 필요한 경우 (Current Mode 사용)
- 가장 최신 상태의 데이터를 읽어야 하는 경우
UPDATE
,DELETE
같은 DML 작업이 수행될 때 현재 값 기준으로 실행SELECT ... FOR UPDATE
를 통해 최신 데이터를 잠금 처리하여 동시 수정 방지
📌 예제: 최신 데이터 조회 및 잠금
SELECT salary FROM employees WHERE emp_id = 100 FOR UPDATE;
5. 결론
✅ Consistent Mode는 쿼리 실행 시점의 일관된 데이터를 제공하며, UNDO를 사용하여 이전 상태를 복구
✅ Current Mode는 가장 최신 데이터를 즉시 반영하며, DML 문장과 SELECT … FOR UPDATE에서 사용
✅ 트랜잭션 충돌을 방지하고 성능을 최적화하려면 상황에 맞게 두 모드를 적절히 활용해야 함 🚀