IT 지식 (기술면접 대비)

트랜잭션이란

KoesJin 2025. 5. 9. 11:17

⭐️ 트랜잭션(Transaction)이란 ?

트랜잭션은 "더 이상 나눌 수 없는 최소 단위의 작업"을 의미한다.

 

쉽게 말해 하나의 작업 단위로 묶인 여러 쿼리문들을 성공하거나, 모두 실패하게 만드는 기능이다.

 

예를 들어, A 계좌에서 B 계좌로 송금한다고 생각해보자.

 

A 계좌에서 돈을 인출하고, B 계좌에 돈을 입금한다.

 

이 두 작업은 반드시 함께 성공하거나, 둘다 실패해야 한다. 중간에 한쪽만 처리되면 심각한 오류가

발생한다. 이때 두 쿼리를 하나의 트랜잭션으로 묶으면 오류를 방지할 수 있다.

 

🧐 왜 사용하는가 ?

데이터 무결성 보장 : 중간에 오류가 나도 전체 작업을 원래대로 돌릴 수 있다.

 

복잡한 처리 단위 관리 : 여러 개의 SQL 작업을 하나처럼 다룰 수 있다.

 

실패 대비 : 예외 발생 시, 이전 상태로 복원 가능 (ROLLBACK)

 


⭐️ 트랜잭션의 4대 특성 (ACID)

1. 🔸 원자성 (Atomicity)

  • 트랜잭션 안의 모든 작업은 모두 성공하거나, 전부 실패해야 한다.
  • 예 : A에서 B로 이체 시 인출만 성공하고 입금 실패하면 전체를 되돌리는 롤백을 실행

2. 🔸 일관성 (Consistency)

  • 트랜잭션이 수행되기 전과 후의 데이터는 항상 일관된 상태여야 한다.
  • 무결성을 해치지 않고 데이터베이스 규칙을 항상 만족시킨다.

3. 🔸 격리성 (Isolation)

  • 둘 이상의 트랜잭션이 동시에 실행되더라도 서로 간섭하지 않는다.
  • 하나의 트랜잭션이 끝나기 전까진, 다른 트랜잭션이 그 결과를 참조할 수 없음

4. 🔸 지속성 (Durability)

  • 트랜잭션이 성공적으로 끝나면, 그 결과는 영구 반영된다.
  • 서버가 다운되더라도 결과는 보존됨.

 

[ 송금 트랜잭션 예시 ]

START TRANSACTION;

UPDATE account SET balance = balance - 10000 WHERE name = 'parent';
UPDATE account SET balance = balance + 10000 WHERE name = 'A';

COMMIT;

 

위와같이 진행하다가 중간에 문제가 생긴다면 아래처럼 ROLLBACK을 사용해 취소가 가능하다.

ROLLBACK;

 


 

⭐️ 트랜잭션의 상태 흐름

 

트랜잭션의 상태 흐름은 아래와 같다.

 

1. 🟢 Active (활성) : 트랜잭션이 실행 중인 상태 

 

-> SQL문이 실행되고 데이터에 대한 읽기 또는 쓰기가 일어나는 단계이다.

 

2. 🟡 Partially Committed (부분 완료) : 트랙잰션의 모든 명렁어문이 실행  완료됐지만, 아직 COMMIT 전 상태

 

-> 데이터베이스에 실제 반영되기 직전이다.

 

3.  Committed (완료) : 트랜잭션이 정상적으로 완료되고, COMMIT이 실행되어 DB에 영구 반영된 상태

 

-> 시스템이 꺼져도 유지 된다.

 

4. 🔴 Failed (실패) : 트랜잭션 수행 중 오류 또는 예외가 발생한 상태

 

-> 예: 제약조건 위반, 시스템 오류, 수동 강제 종료 등이 있다.

-> 트랜잭션을 정상 종료할 수 없는 상태

 

5. ⚠️  Aborted (철회) : 실패 후 ROLLBACK 되어 이전 상태로 복구된 상태 -> 트랜잭션 자체가 실패한 상태

 

-> 데이터베이스는 아무 일도 없던 것처럼 원래대로 되돌아간다.

 

* ROLLBACK : 트랜잭션이 실패(Failed)했을 때, 수동 또는 자동으로 실행되는 복구 명령어 이다.

변경 사항을 모두 취소하고 원래 상태로 돌아간다. -> 가장 최근의 COMMIT 상태로 돌아감.

 

✚ 체크포인트 (CheckPoint)란 ?

체크 포인트는 트랜잭션 로그를 주기적으로 저장하여 복구 시점의 기준으로 사용하는 메커니즘이다.

 

시스템 장애 시, 체크포인트 이후의 트랜잭션만 복구하면 된다. -> 성능 향상

 


[ 트랜잭션 SQL 명령어 예제  - 체크포인트 X ]

-- ✅ 트랜잭션 시작
START TRANSACTION;

-- 🔎 초기 조회
SELECT * FROM members;

-- 📝 데이터 삽입
INSERT INTO members VALUES(1, '홍길동', '010-1111-2222');

-- 🔎 삽입 결과 확인
SELECT * FROM members;

-- 💾 트랜잭션 커밋
COMMIT;

-- 실패 시 롤백
-- ROLLBACK;

 

[ 트랜잭션 SQL 명령어 예제 - 체크포인트 O ]

-- 트랜잭션 시작
START TRANSACTION;

-- 1단계: 초기 데이터 확인
SELECT * FROM members;

-- 2단계: 첫 번째 INSERT
INSERT INTO members VALUES(10, '김철수', '서울', '010-1111-1111');

-- 체크포인트 설정
SAVEPOINT sp1;

-- 3단계: 두 번째 INSERT
INSERT INTO members VALUES(20, '이영희', '부산', '010-2222-2222');

-- 4단계: 세 번째 INSERT
INSERT INTO members VALUES(30, '박민수', '인천', '010-3333-3333');

-- 여기까지 INSERT한 상태를 확인
SELECT * FROM members;

-- 🚨 실수 발생! 두 번째, 세 번째 INSERT 취소하고 싶을 때
ROLLBACK TO sp1;

-- 다시 SELECT해서 상태 확인 (김철수만 남고, 이영희/박민수는 롤백됨)
SELECT * FROM members;

-- 트랜잭션 최종 커밋
COMMIT;

 

[ 오토 커밋 설정 ]

-- 자동 커밋 OFF
SET AUTOCOMMIT = 0;

-- 자동 커밋 ON
SET AUTOCOMMIT = 1;

-- 현재 오토커밋 상태 확인
SELECT @@autocommit;

 

 

[ 오토 커밋 vs 수동 커밋 ]

항목 자동커밋 수동커밋(트랜잭션 직접 제어)
기본 동작 SQL 실행 시 자동 COMMIT START TRANSACTION 이후 직접 COMMIT
제어권 DB가 처리 개발자가 처리
롤백 가능 여부 X 불가능 O 가능
사용 예시  단순 CRUD 은행 이체 주문 결제 등 복잡한 논리

 

🛑 트랜잭션이 적용되지 않는 경우

아래와 같은 DDL 명령어에는 트랜잭션 롤백이 적용되지 않는다.

 

- CREATE 

- DROP

- ALTER

- TRUNCATE

 

위 DDL들은 실행 즉시 반영되며, ROLLBACK이 불가능하다.

 

이 명령어들은 데이터베이스의 스키마(설계도)를 바꾸기 때문에, 단순한 데이터 처리와는 다른 처리가 필요하기 때문.

 

하지만 PostgreSQL같은 DBMS는 제한적으로 DDL 트랜잭션 롤백을 지원하기도하지만,

ORACLE, MySQL 등의 DBMS는 DDL 트랜잭션 대상이 아니다.