본문 바로가기

SQL & 데이터베이스/데이터 무결성 & 트랜잭션

[SQL] 트랜잭션(Transaction) 개념 및 오라클 예제

[SQL] 트랜잭션(Transaction) 개념 및 오라클 예제

1. 트랜잭션(Transaction)이란?

트랜잭션(Transaction)은 데이터베이스에서 **하나의 논리적인 작업 단위**를 의미합니다.
즉, 여러 개의 SQL 문장을 하나의 작업 단위로 묶어 **모두 성공하거나, 모두 실패해야 하는 원칙**을 따릅니다.

✔️ 예시: 은행 계좌 이체를 생각해보면, - A 계좌에서 **100만 원을 출금**하고 - B 계좌에 **100만 원을 입금**하는 작업은 **둘 중 하나라도 실패하면 전체 작업이 취소되어야 합니다.**


2. 트랜잭션의 주요 특성 (ACID 원칙)

  • ✅ 원자성(Atomicity): 트랜잭션 내의 모든 작업이 **모두 수행되거나, 전혀 수행되지 않아야 함**
  • ✅ 일관성(Consistency): 트랜잭션 실행 후에도 **데이터의 무결성이 유지되어야 함**
  • ✅ 격리성(Isolation): 하나의 트랜잭션이 실행되는 동안 **다른 트랜잭션의 영향을 받지 않아야 함**
  • ✅ 지속성(Durability): 트랜잭션이 성공적으로 완료되면 **영구적으로 저장되어야 함**

3. 오라클에서 트랜잭션 사용 예제

✅ 1) 트랜잭션 시작과 종료 (COMMIT & ROLLBACK)


-- 계좌 이체 예제
UPDATE accounts SET balance = balance - 100000 WHERE account_id = 'A001';
UPDATE accounts SET balance = balance + 100000 WHERE account_id = 'B001';

-- 모든 작업이 정상적으로 수행되었을 경우 확정(COMMIT)
COMMIT;

-- 문제가 발생했을 경우 이전 상태로 복구(ROLLBACK)
ROLLBACK;

✅ 2) SAVEPOINT를 활용한 부분 롤백


-- 특정 지점에서 저장
SAVEPOINT step1;

-- 일부 데이터 수정
UPDATE accounts SET balance = balance - 50000 WHERE account_id = 'A001';

-- 문제가 발생하면 여기까지만 롤백 가능
ROLLBACK TO step1;

-- 최종적으로 확정
COMMIT;

4. 트랜잭션 격리 수준 (Isolation Level)

여러 트랜잭션이 동시에 실행될 때, 데이터 충돌을 방지하기 위해 **격리 수준(Isolation Level)**을 설정할 수 있습니다.

격리 수준설명발생 가능 문제
READ UNCOMMITTED다른 트랜잭션이 커밋되지 않은 데이터를 읽을 수 있음Dirty Read
READ COMMITTED다른 트랜잭션이 **커밋된 데이터만** 읽을 수 있음Non-repeatable Read
REPEATABLE READ트랜잭션이 시작될 때 조회한 데이터는 변경되지 않음Phantom Read
SERIALIZABLE트랜잭션을 순차적으로 실행하여 충돌을 방지성능 저하

✅ 오라클에서 격리 수준 설정 예제


-- READ COMMITTED (오라클 기본 격리 수준)
ALTER SESSION SET ISOLATION LEVEL READ COMMITTED;

-- SERIALIZABLE 격리 수준으로 변경
ALTER SESSION SET ISOLATION LEVEL SERIALIZABLE;

5. 트랜잭션이 중요한 이유

  • ✔ **데이터 무결성을 유지** (데이터 손실 방지)
  • ✔ **여러 작업을 안전하게 수행** (은행 계좌 이체, 주문 처리 등)
  • ✔ **데이터 충돌을 방지** (다중 사용자 환경에서도 안정적인 데이터 처리)

🔍 결론

트랜잭션은 데이터베이스에서 매우 중요한 개념이며, 특히 **안정적인 데이터 처리를 위해 ACID 원칙을 반드시 지켜야 합니다.**

또한, 오라클에서는 트랜잭션을 활용하여 **데이터 무결성을 보장하고, 복구 기능을 사용할 수 있습니다.**


📖 다른 SQL 개념도 함께 확인하세요!

👉 SQL 튜닝 & 최적화 가이드 보러 가기