트랜잭션은 데이터베이스에서 하나의 논리적인 작업 단위로,
여러 연산이 하나의 단위로 처리되어야 할 때 사용됩니다.
모든 연산이 성공해야만 커밋되고, 하나라도 실패하면 전체가 롤백되어야 합니다.
트랜잭션(Transaction)은 데이터베이스에서
하나의 논리적인 작업 단위(logical unit of work)로 간주되는 연산 집합입니다.
일반적으로 데이터베이스의 일관성 유지를 위해
전체 연산이 모두 성공하거나 모두 실패해야 하는 경우 사용됩니다.
예를 들어, 은행 계좌 이체의 경우 '출금'과 '입금'은 반드시 함께 성공하거나 함께 실패해야 합니다.
트랜잭션은 ACID 특성을 가집니다.
원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability)입니다.
각각 트랜잭션의 신뢰성과 안정성을 보장합니다.
트랜잭션은 다음의 ACID 속성을 만족해야 합니다:
Atomicity (원자성): 모든 작업이 전부 성공하거나 전부 실패해야 합니다.
Consistency (일관성): 트랜잭션 수행 전후에 DB는 항상 일관된 상태를 유지해야 합니다.
Isolation (격리성): 동시에 실행되는 트랜잭션 간 간섭이 없어야 합니다.
Durability (지속성): 커밋된 트랜잭션의 결과는 영구적으로 반영되어야 합니다.
이 네 가지 특성은 트랜잭션의 신뢰성을 보장하는 핵심 기준입니다.
ACID는 트랜잭션이 지켜야 할 4가지 특성입니다:
원자성, 일관성, 격리성, 지속성.
이 특성들이 트랜잭션의 안정성과 데이터의 무결성을 보장합니다.
ACID는 트랜잭션의 신뢰성과 안정성을 보장하기 위한 네 가지 핵심 특성을 의미합니다:
원자성은 트랜잭션 안의 연산이 모두 성공하거나, 하나라도 실패하면 전체가 롤백되는 성질입니다.
Atomicity(원자성)은 트랜잭션 내의 모든 연산이 하나의 단위로 실행되어야 함을 의미합니다.
이 말은, 어떤 연산이 실패하면 트랜잭션 전체가 취소되어야 하며,
그에 따른 모든 변경 사항은 데이터베이스에서 완전히 무효화(Rollback) 되어야 한다는 뜻입니다.
이는 시스템 장애나 예외 상황에서 데이터 일관성 유지에 필수적인 특성입니다.
일관성은 트랜잭션 실행 전후의 데이터 상태가 항상 유효하고,
제약조건을 만족하는 상태를 유지해야 한다는 의미입니다.
Consistency(일관성)은 트랜잭션 수행 전후에 데이터가
항상 정합성 있는(valid) 상태를 유지해야 함을 의미합니다.
이는 데이터베이스가 정의한 무결성 제약조건(예: 외래키, 유일성 제약, 체크 제약 등) 을
위반하지 않도록 보장하며, 트랜잭션이 잘못된 상태를 저장하지 않도록 합니다.
격리성은 여러 트랜잭션이 동시에 실행될 때 서로의 작업이 간섭하지 않도록 보장하는 성질입니다.
이 속성이 부족하면 다음과 같은 문제들이 발생할 수 있습니다.
Dirty Read: 다른 트랜잭션이 아직 커밋하지 않은 데이터를 읽음
Non-repeatable Read: 같은 쿼리를 여러 번 실행했을 때 결과가 달라짐
Phantom Read: 쿼리 결과 집합이 실행마다 달라짐 (삽입/삭제로 인한)
격리성은 트랜잭션 격리 수준을 통해 조절할 수 있습니다.
지속성은 트랜잭션이 성공적으로 커밋된 후에는
시스템 오류가 나더라도 그 결과가 보존되어야 한다는 의미입니다.
Durability(지속성)은 트랜잭션이 성공적으로 커밋(commit) 된 후,
해당 결과가 시스템 장애(예: 전원 장애, 시스템 크래시 등) 발생 시에도
영구적으로 데이터베이스에 반영되어 있어야 한다는 성질입니다.
지속성을 보장하기 위해 DBMS는 일반적으로
Write-Ahead Logging(WAL), Redo Log, Checkpoint 등의 메커니즘을 사용합니다.
트랜잭션은 명시적으로 시작되거나, SQL 명령어 실행 시 자동으로 시작됩니다.
종료는 COMMIT으로 성공 시 확정되거나, ROLLBACK으로 실패 시 복구됩니다.
트랜잭션의 시작과 종료는 DBMS나 개발 언어의 설정에 따라 자동 혹은 수동으로 관리될 수 있습니다:
시작(START):
종료(END):
COMMIT: 트랜잭션이 성공적으로 수행된 경우 변경 사항을 영구 반영
ROLLBACK: 오류나 예외 발생 시 변경 사항을 전부 취소하여 이전 상태로 복구
COMMIT은 트랜잭션 내의 변경을 확정하는 명령이고, ROLLBACK은 그 변경을 취소하고 이전 상태로 되돌리는 명령입니다.
- COMMIT:
- 현재까지 트랜잭션에서 수행한 모든 변경 사항을 영구적으로 데이터베이스에 저장하고
트랜잭션을 종료합니다.
- ROLLBACK:
- 트랜잭션 도중 문제가 발생했을 때, 모든 변경 사항을 취소하고 원래 상태로 되돌립니다.
이 두 명령은 트랜잭션 제어의 핵심이며, 원자성과 일관성을 보장하는 데 필수적이다.
트랜잭션 격리 수준은 동시에 실행되는 트랜잭션 간의 간섭 정도를 조절하는 설정입니다.
READ UNCOMMITTED부터 SERIALIZABLE까지 4단계가 있습니다.
트랜잭션 격리 수준(Isolation Level)은 동시에 실행되는 트랜잭션 간의 간섭 허용 범위를 결정합니다.
ANSI SQL 표준에서 정의한 네 가지 수준은 다음과 같습니다.
격리 수준 | 허용되는 문제 | 특징 |
---|---|---|
READ UNCOMMITTED | Dirty Read 허용 | 가장 낮은 수준, 빠르지만 무결성 위험 |
READ COMMITTED | Non-repeatable Read 허용 | 대부분의 DBMS 기본 설정 |
REPEATABLE READ | Phantom Read 허용 | 동일 쿼리 결과가 항상 동일 |
SERIALIZABLE | 없음 | 가장 엄격, 성능 저하 가능성 있음 |
격리 수준이 높을수록 데이터 무결성은 보장되지만, 성능은 낮아질 수 있습니다.