목차
<트랜잭션?>
개념
- DB시스템에서 완전성을 유지하기 위해 하나의 작업 단위로 처리되는 일련의 연산들
- 모든 연산이 성공적으로 완료되어 DB가 일관된 상태를 유지하게 하거나, 실패할 경우 시작 전 상태로 롤백하여 DB의 안정성과 정확성을 보장한다.
- DB관리의 핵심 개념 중 하나로, ACID 속성으로 요약된다.
ACID 속성
- 원자성(Atomicity): 트랜잭션 내 모든 연산은 하나의 단위로 처리되어야 한다. 즉, 모든 연산이 성공적으로 완료되거나, 하나라도 실패할 경우 전체 트랜잭션이 취소되어야 한다.
- 일관성(Consistency): 트랜잭션이 성공적으로 완료되면, DB는 하나의 일관된 상태에서 다른 일관된 상태로 변해야 한다. 이는 트랜잭션 전후로 DB의 무결성 제약 조건이 유지되어야 함을 의미한다.
- 독립성(Isolation): 동시에 실행되는 여러 트랜잭션이 서로에게 영향을 주지 않아야 한다. 즉, 하나의 트랜잭션이 진행 중일 때 다른 트랜잭션의 중간 상태를 볼 수 없다.
- 지속성(Durability): 트랜잭션이 성공적으로 완료된 후에는, 그 결과로 시스템 장애가 발생하더라도 영구적으로 반영되어야 한다.
트랜잭션의 주요 연산
- Begin Transaction: 트랜잭션의 시작을 선언한다.
- Commit: 트랜잭션이 성공적으로 완료되었음을 시스템에 알리고, 데이터베이스 변경사항을 영구적으로 저장한다.
- Rollback: 트랜잭션 중에 오류가 발생하면, 변경사항을 취소하고 트랜잭션 시작 전 상태로 데이터베이스를 복원한다.
트랜잭션 처리의 중요성
트랜잭션 처리는 데이터의 일관성과 무결성을 유지하면서 동시성 제어와 데이터 복구를 가능하게 하는 DB 시스템의 중요한 기능이다. 특히, 금융 시스템, 예약 시스템 등 오류가 발생할 경우 큰 손실을 초래할 수 있는 시스템에서는 트랜잭션 처리의 중요성이 더욱 강조된다. 데이터의 정확성과 안정성을 보장하기 위해, 시스템 설계 시 트랜잭션 관리에 대한 충분한 고려가 필요하다.
<예시>
다음은 간단한 은행 계좌 이체를 예로들어 트랜잭션의 원자성, 일관성, 독립성, 지속성(ACID 속성)을 보여주는 과정이다
상황
A 계좌에서 B 계좌로 100만 원을 이체한다고 가정해보자. 이 과정에서 발생하는 주요 트랜잭션 연산은 다음과 같다:
- 트랜잭션 시작(Begin Transaction)
- A 계좌에서 100만 원 차감
- B 계좌에 100만 원 추가
- 트랜잭션 커밋(Commit) 또는 롤백(Rollback)
과정 설명
1. 트랜잭션 시작 (Begin Transaction)
- 트랜잭션이 시작되며, 이체 작업이 한 작업 단위로 처리될 것임을 데이터베이스 관리 시스템(DBMS)에 알린다.
2. A 계좌에서 100만 원 차감
- A 계좌의 잔액을 확인하고, 100만 원을 차감한다. 이 때의 변경 사항은 아직 임시적이며, 트랜잭션이 완료되어 커밋되기 전까지 최종적으로 반영되지 않는다.
3. B 계좌에 100만 원 추가
- B 계좌의 잔액을 확인하고, 100만 원을 추가한다. A 계좌에서 차감된 금액이 B 계좌에 추가되는 것으로, 이 과정 역시 커밋 전까진 임시적이다.
4. 트랜잭션 커밋(Commit) 또는 롤백(Rollback)
- 모든 작업이 성공적으로 처리되면, 커밋 연산을 통해 변경 사항을 데이터베이스에 영구적으로 반영한다.
- 만약 작업 중 오류가 발생하거나, A 계좌의 잔액이 부족한 경우처럼 트랜잭션을 정상적으로 완료할 수 없다면, 롤백 연산을 실행하여 모든 변경 사항을 취소하고 트랜잭션 시작 전 상태로 돌아간다.
ACID 속성 적용
- 원자성(Atomicity): A 계좌의 차감과 B 계좌의 추가가 모두 성공적으로 이루어지거나, 아니면 아무런 변경도 발생하지 않아야 한다(전부 실행되거나 전부 실행되지 않아야 한다).
- 일관성(Consistency): 이체 후에도 두 계좌의 총액은 변하지 않아야 한다. 이는 데이터베이스의 무결성 제약을 유지한다. 무결성 제약 조건은 별도 페이지 참고
- 독립성(Isolation): 이 트랜잭션이 진행되는 동안 다른 트랜잭션이 이 계좌들의 잔액을 조회하거나 변경할 수 없다.
- 지속성(Durability): 트랜잭션이 한 번 커밋되면, 그 결과는 데이터베이스 장애가 발생하더라도 유지되어야 한다.
이처럼 트랜잭션은 여러 단계의 연산을 포함할 수 있으며, ACID 속성을 통해 데이터의 일관성과 안정성을 보장한다.
은행 계좌 이체 과정을 SQL 문을 사용해 표현하면 다음과 같다.
(예시)
- A 계좌의 ID : account_a,
- B 계좌의 ID : account_b
- 이체 금액 : 100만원
-- 트랜잭션 시작
BEGIN;
-- A 계좌에서 100만 원 차감
UPDATE accounts
SET balance = balance - 1000000
WHERE account_id = 'account_a';
-- B 계좌에 100만 원 추가
UPDATE accounts
SET balance = balance + 1000000
WHERE account_id = 'account_b';
-- 잔액 확인 및 에러 처리 로직 (여기서는 간단히 표현)
-- 예를 들어, A 계좌의 잔액이 음수가 되는 경우 롤백
-- 실제로는 어플리케이션 코드에서 이러한 검사를 수행하고,
-- 조건에 따라 COMMIT 또는 ROLLBACK을 결정
-- 조건에 따라 트랜잭션 커밋 또는 롤백
-- 모든 조건이 충족되면 커밋, 그렇지 않으면 롤백
COMMIT;
-- ROLLBACK; -- 필요한 경우 롤백
<ACID가 깨진 경우의 상황들>
다음은 ACID 속성 각각이 깨졌을 때 발생할 수 있는 예시나 상황을 표현한 것이다. 이러한 상황을 이해함으로써, ACID 속성이 데이터베이스 관리 시스템에서 왜 중요한지를 더욱 명확하게 파악할 수 있을 것이다.
1. 원자성(Atomicity)이 깨진 경우
- 상황: A 계좌에서 B 계좌로 송금 중, 금액을 A 계좌에서 차감한 후 시스템이 다운되어 B 계좌에 금액을 추가하지 못함.
- 결과: A 계좌의 금액만 차감되고, B 계좌에는 추가되지 않아 돈이 '사라지는' 현상이 발생. 트랜잭션이 중간에 실패하여 원자성이 깨졌기 때문에 발생한 문제
2. 일관성(Consistency)이 깨진 경우
- 상황: 데이터베이스에서 나이를 나타내는 필드에 음수 값이 저장되는 오류.
- 결과: 데이터베이스의 무결성 제약 조건을 위배하는 데이터가 저장되어, 데이터의 신뢰성과 정확성이 손상됨. 일관성이 보장되지 않으면, 데이터베이스의 상태가 불일치하게 됨.
3. 독립성(Isolation)이 깨진 경우
- 상황: 동시에 두 트랜잭션이 실행되는데, 하나의 트랜잭션이 아직 완료되지 않은 상태의 데이터를 다른 트랜잭션이 읽고 변경함.
- 결과: '더티 리드(Dirty Read)'가 발생하여, 최종적으로 완료되지 않을 수 있는 데이터를 기반으로 잘못된 결정이나 계산이 이루어질 수 있음. 이는 데이터베이스의 일관된 상태도 보장할 수 없게 만든다.
4. 지속성(Durability)이 깨진 경우
- 상황: 트랜잭션이 성공적으로 완료되고 커밋되었지만, 시스템 장애로 인해 DB에 변경사항이 반영되지 않음.
- 결과: 장애 발생 후 시스템 복구 시, 트랜잭션 완료에 따른 변경사항이 손실되어, 커밋된 데이터가 영구적으로 저장되지 않음. 이는 트랜잭션의 결과가 지속되지 않는 상황을 의미함.
ACID 속성 중 하나라도 제대로 지켜지지 않을 경우, 데이터베이스의 신뢰성과 정확성이 크게 저하될 수 있다. 이러한 문제들을 방지하기 위해 데이터베이스 관리 시스템은 트랜잭션을 처리하며 ACID 속성을 엄격하게 유지해야 한다.
'DBMS > SQL' 카테고리의 다른 글
[데이터베이스] SQL 치팅시트: DDL, DML, DCL 커맨드 목록 (2) | 2024.04.21 |
---|---|
[데이터베이스] 정규화(Normalization) (1NF - 5NF) (0) | 2024.04.15 |
[데이터베이스] DB용어 - 키 (슈퍼키, 후보키, 기본키, 대체키, 외래키) (1) | 2024.04.14 |
[데이터베이스] DB용어 - [완전, 이행, 부분] 함수(적) 종속 (1) | 2024.04.14 |
[데이터베이스] 무결성 제약 조건 (Integrity Constraints : IC) (2) | 2024.03.21 |