⭐️ 트랜잭션(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 트랜잭션 대상이 아니다.
'IT 지식 (기술면접 대비)' 카테고리의 다른 글
HTTP란 ? (4) | 2025.05.13 |
---|---|
MVC 패턴이란 ? (2) | 2025.05.12 |
RDBMS란 (0) | 2025.05.08 |
데이터베이스의 다양한 유형 관계 (2) | 2025.05.07 |
SQL JOIN의 'INNER JOIN'과 'LEFT JOIN'의 차이점은 무엇인가 (0) | 2025.05.02 |