* 트랜잭션(Transaction)이란?
트랜잭션은 데이터베이스에서 논리적인 작업의 단위를 의미한다. 여러 작업이 하나의 단일 작업처럼 수행되도록 보장하여 데이터의 일관성과 무결성을 유지하는 역할을 한다.
* 트랜잭션의 4가지 특성(ACID)
- 원자성 (Atomicity)
- 모든 작업이 완전히 수행되거나 전혀 수행되지 않아야 함
- 중간에 오류가 발생하면 모든 작업이 롤백(Rollback)
- 예: 송금 시, 돈을 보내는 작업과 받는 작업이 모두 성공하거나 둘 다 취소됨
- 일관성 (Consistency)
- 트랜잭션 전후로 데이터베이스의 상태가 일관되어야 함
- 예: 은행 계좌에서 출금 후에도 총 잔액은 변하지 않음
- 격리성 (Isolation)
- 동시에 수행되는 트랜잭션이 서로 영향을 미치지 않도록 보장
- 예: 두 사용자가 동시에 같은 상품을 구매해도 재고가 음수가 되지 않음
- 지속성 (Durability)
- 트랜잭션이 완료된 후에는 영구적으로 데이터베이스에 반영됨
- 예: 주문 완료 후 시스템이 꺼져도 주문 기록은 유지됨
* 트랜잭션의 주요 연산
- BEGIN / START TRANSACTION: 트랜잭션 시작
- COMMIT: 모든 작업을 영구적으로 반영
- ROLLBACK: 모든 작업을 취소하고 원래 상태로 복구
* 트랜잭션의 예시
START TRANSACTION;
-- 출금 처리
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
-- 오류 확인
IF ROW_COUNT() = 0 THEN
ROLLBACK;
SELECT 'Transaction failed. Rolled back.' AS message;
LEAVE;
END IF;
-- 입금 처리
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
-- 오류 확인
IF ROW_COUNT() = 0 THEN
ROLLBACK;
SELECT 'Transaction failed. Rolled back.' AS message;
LEAVE;
END IF;
COMMIT;
SELECT 'Transaction committed successfully.' AS message;
→ 계좌 간 송금을 하나의 트랜잭션으로 처리. 출금과 입금이 모두 성공해야만 COMMIT이 수행됨. 오류가 발생할 시, ROLLBACK되며 출금과 입금 모두 처리되지 않는다.
* 트랜잭션 격리 수준(Isolation Levels)
트랜잭션에는 트랜잭션 간의 간섭을 최소화하기 위한 격리 수준이 존재한다.
- READ UNCOMMITTED
- 다른 트랜잭션의 커밋되지 않은 데이터도 읽을 수 있음
- 가장 낮은 격리 수준, 데이터 일관성 문제 발생 가능
- READ COMMITTED
- 커밋된 데이터만 읽을 수 있음
- 대부분의 RDBMS에서 기본 격리 수준
- REPEATABLE READ
- 트랜잭션 동안 동일한 데이터는 동일하게 읽힘
- 팬텀 읽기(Phantom Read) 문제 발생 가능
- SERIALIZABLE
- 가장 높은 격리 수준, 모든 트랜잭션을 직렬화하여 처리
- 데이터 일관성은 보장되지만 성능 저하 발생
* 팬텀 읽기(Phantom Read)
팬텀 읽기는 일정 범위의 데이터를 여러 번 읽을 때, 첫 번째 쿼리에 없던 유령(Phantom) 데이터가 두 번째 쿼리에서는 나타나는 현상이다.
* 결론
- 트랜잭션은 데이터베이스에서 논리적인 작업 단위로, ACID 특성을 만족시켜 데이터의 일관성과 무결성을 보장
- COMMIT과 ROLLBACK으로 작업의 성공/실패를 관리
- 트랜잭션의 격리 수준을 통해 동시성 제어 가능
'Computer Science > DB' 카테고리의 다른 글
[DB] PostgreSQL 설치 및 환경 설정 (0) | 2021.09.21 |
---|---|
[DB] SQL의 개념 (0) | 2021.09.10 |
[DB] 데이터베이스의 개념 (0) | 2021.09.10 |