Transaction이란?
Transaction은 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위입니다. 이는 한 번에 수행되어야 할 일련의 연산들을 의미합니다. Transaction은 전체가 성공적으로 완료되거나 전혀 실행되지 않은 상태로 남아있어야 합니다.
예를 들어, 은행 계좌에서 돈을 인출하는 과정을 생각해봅시다:
- 계좌 잔액 확인
- 인출 금액만큼 잔액 감소
- 현금 지급
- 거래 내역 기록
이 모든 단계가 하나의 transaction으로 처리되어야 합니다.
ACID 속성
ACID는 데이터베이스 transaction의 안정성을 보장하기 위한 네 가지 속성을 나타냅니다.
- Atomicity (원자성)
- Consistency (일관성)
- Isolation (격리성)
- Durability (지속성)
각 속성에 대해 자세히 살펴보겠습니다.
Atomicity (원자성)
Atomicity는 transaction의 모든 연산이 성공적으로 완료되거나 전혀 실행되지 않아야 함을 의미합니다. 즉, transaction은 분할할 수 없는 최소 단위의 작업입니다.
예시: 계좌 이체
계좌 A에서 계좌 B로 100만원을 이체하는 상황을 가정해봅시다.
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 1000000 WHERE account_id = 'A';
UPDATE accounts SET balance = balance + 1000000 WHERE account_id = 'B';
COMMIT;
이 transaction에서 첫 번째 UPDATE는 성공했지만 두 번째 UPDATE가 실패한다면, 원자성에 의해 전체 transaction이 취소(rollback)되어야 합니다.
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 1000000 WHERE account_id = 'A';
-- 두 번째 UPDATE 실패 가정
ROLLBACK;
Consistency (일관성)
Consistency는 transaction이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지되어야 함을 의미합니다.
예시: 잔액 제약 조건
계좌의 잔액이 항상 0 이상이어야 한다는 제약 조건이 있다고 가정해봅시다.
BEGIN TRANSACTION;
-- 계좌 A의 현재 잔액이 500,000원이라고 가정
UPDATE accounts SET balance = balance - 1000000 WHERE account_id = 'A';
-- 이 시점에서 잔액이 -500,000원이 되어 일관성이 깨짐
-- 따라서 이 transaction은 commit되지 않고 rollback되어야 함
ROLLBACK;
Isolation (격리성)
Isolation은 동시에 실행되는 transaction들이 서로 영향을 미치지 않도록 보장합니다.
예시: 동시 접근 제어
두 사용자가 동시에 같은 계좌에 접근하는 상황을 고려해봅시다.
-- 사용자 1의 transaction
BEGIN TRANSACTION;
SELECT balance FROM accounts WHERE account_id = 'A';
-- 잔액이 1,000,000원이라고 가정
UPDATE accounts SET balance = balance - 500000 WHERE account_id = 'A';
COMMIT;
-- 사용자 2의 transaction (동시에 실행)
BEGIN TRANSACTION;
SELECT balance FROM accounts WHERE account_id = 'A';
-- 격리성이 보장되지 않으면, 여기서 잔액이 1,000,000원으로 보일 수 있음
UPDATE accounts SET balance = balance - 700000 WHERE account_id = 'A';
COMMIT;
격리성이 보장되지 않으면, 두 번째 transaction이 첫 번째 transaction의 변경사항을 반영하지 않은 상태에서 실행될 수 있습니다. 이를 방지하기 위해 적절한 격리 수준을 설정해야 합니다.
Durability (지속성)
Durability는 성공적으로 완료된 transaction의 결과가 영구적으로 반영되어야 함을 의미합니다. 시스템 장애가 발생하더라도 완료된 transaction의 결과는 보존되어야 합니다.
예시: 로깅 시스템
Java Database Connectivity
try {
// transaction 시작
connection.setAutoCommit(false);
// 데이터베이스 연산 수행
statement.executeUpdate("UPDATE accounts SET balance = balance - 1000000 WHERE account_id = 'A'");
statement.executeUpdate("UPDATE accounts SET balance = balance + 1000000 WHERE account_id = 'B'");
// 로그에 transaction 기록
logTransaction("Transfer 1,000,000 from A to B");
// transaction 완료
connection.commit();
} catch (SQLException e) {
// 오류 발생 시 rollback
connection.rollback();
} finally {
connection.setAutoCommit(true);
}
이 예시에서 logTransaction
메서드는 transaction의 내용을 영구 저장소에 기록합니다. 시스템 장애가 발생하더라도 이 로그를 통해 완료된 transaction을 복구할 수 있습니다.
결론
ACID 속성은 데이터베이스 transaction의 안정성과 신뢰성을 보장하는 중요한 개념입니다. Atomicity는 transaction의 완전성을, Consistency는 데이터의 일관성을, Isolation은 동시 실행의 독립성을, Durability는 결과의 영속성을 보장합니다. 이러한 속성들을 제대로 이해하고 구현함으로써, 우리는 안정적이고 신뢰할 수 있는 데이터베이스 시스템을 구축할 수 있습니다.
'데이터베이스 (DB)' 카테고리의 다른 글
B-Tree와 B+Tree: 효율적인 데이터 구조의 비교 (0) | 2024.11.10 |
---|---|
데이터베이스 인덱싱(Indexing) (0) | 2024.11.09 |
varchar(255)를 알고 사용하는가? (4) | 2024.11.08 |
원온원(1on1) 미팅 관리 시스템: 설계 및 구현 가이드 (0) | 2024.11.07 |
테이블 정보 조회하기, Table Description 쿼리 (0) | 2024.10.25 |