오늘은 데이터베이스 운용에 필수적인 개념인 트랜잭션과 ACID 특성을 알아보겠습니다.
은행 시스템으로 사례를 들어 누구든 흥미롭게(?) 느낄 수 있도록 설명해보겠습니다.
: DB의 상태를 변경시키는 작업 단위
조금 더 쉽게 말하면 트랜잭션(Transaction)은 DB에 저장하고(Create) 읽고(Read) 변경(Update)하고 삭제(Delete)하는 작업들의 집합 단위입니다. 이는 단순히 하나의 SQL이 아니라, 특정 작업을 수행하기 위해 모아놓은 SQL의 논리적 단위를 말합니다. CRUD...논리적...집합..? 백문이 불여일견..입니다. 예시를 보면 이해가 더 쉬울 것 같습니다.
(예시) 은행 송금 시스템
뱅킹 시스템에서 A가 B에게 송금하는 상황
이 경우 두 동작을 묶어서 하나의 트랜잭션으로 처리합니다.
왜냐면, 출금만 처리되고 입금이 실패하면 A의 계좌에서 돈이 빠져나가고 B는 돈을 받지 못하는 데이터 불일치 문제가 발생하기 때문입니다. 트랜잭션은 일련의 동작을 묶어 처리함으로써 이런 문제를 방지하는 안정장치입니다.
트랜잭션은 ACID라는 4가지 주요 특성을 만족해야 합니다. 아래에서 예시를 통해 하나씩 알아보겠습니다.
1. Atomicity (원자성)
트랜잭션은 쪼갤 수 없는 하나의 단위로 처리됩니다.
즉, 트랜잭션에 포함된 모든 SQL이 DB에 반영되거나 어떤 부분도 반영되지 않거나 이 둘 중 하나여야 합니다.
(예시)
2. Consistency (일관성)
트랜잭션이 실행되기 전과 후의 데이터 상태는 일정한 규칙(무결성 제약 조건)을 만족해야 합니다.
(예시)
3. Isolation (격리성)
동시에 실행되는 트랜잭션은 서로 독립적으로 처리되어야 하며, 다른 트랜잭션의 중간 상태를 볼 수 없어야 합니다.
(예시)
A가 B에게 송금을 진행 중일 때, A의 계좌 잔액을 조회하면 송금이 진행되기 이전의 상태만 볼 수 있어야 합니다. 이는 Shared Lock(읽기 잠금)이나 Exclusive Lock(쓰기 잠금)과 같은 메커니즘으로 구현됩니다.
4. Durability (지속성)
트랜잭션이 성공적으로 완료된 후에는 어떠한 시스템 오류나 장애가 발생해도 작업 결과가 유지되어야 합니다.
(예시)
송금 트랜잭션이 성공적으로 끝난 뒤에는 데이터베이스 서버가 중단되더라도 A와 B의 계좌 상태는 변하지 않아야 합니다. 이를 위해 데이터를 비휘발성 메모리에 저장하고, 문제가 생기면 로그를 이용하여 복구합니다.
우선 ACID의 기술적인 측면을 살펴보기 전에 트랜잭션 상태와 commit, rollback에 대한 내용을 먼저 살펴보겠습니다.
트랜잭션은 실행부터 종료까지 아래의 상태를 가지며, Commit 또는 Rollback으로 종료가 됩니다
Commit
Rollback
내부적으로 ACID가 어떻게 지켜지는지 궁금해서 찾아본 내용
Atomicity (원자성)
Consistency (일관성)
(예시)
A 계좌의 잔액이 음수가 될 수 없다는 규칙이 있을 때, 출금 요청을 처리하기 전 잔액을 확인합니다. 잔액이 부족하면 트랜잭션이 중단됩니다.
Isolation (격리성)
Durability (지속성)
가끔 궁금해지는 “왜 은행은 점검 시간이 필요할까?”에 대해 이야기 해보겠습니다.
KB국민은행 | 매일 00:00 ~ 00:05 |
신한은행 | 매일 23:50 ~ 00:05 |
IBK기업은행 | 매일 23:50 ~ 00:10 |
NH농협은행 | 매일 23:55 ~ 00:30 |
은행 시스템은 매일 데이터의 무결성과 일관성을 유지하기 위해 점검 시간을 가집니다. 점검 시간에는 다음 작업을 포함한 다양한 작업들이 이루어집니다:
[DB] 로드 밸런싱, 로드 밸런싱 알고리즘 (1) | 2024.12.05 |
---|
댓글 영역