트랜잭션(Transaction)
트랜잭션(Transaction)은 데이터베이스에서 수행되는 논리적 작업 단위이다.
트랜잭션에 대해서 찾아보면 대표적인 예시로 송금 작업이 있다.
송금하려는 사람의 계좌에 잔액을 먼저 확인하고 일정 금액을 상대방에게 송금한 후 상대방의 잔액을 조회하는 일련의 작업들을 묶은 것을 트랜잭션이라고 한다.
송금 예시는 일반 사용자가 사용하는 입장이고 실제 데이터베이스를 생각해 보자.
실제 데이터베이스에서 이루어지는 작업이라고 하면 읽기, 쓰기, 갱신 등 여러 작업이 있을 것이다.
각각의 작업들을 개별적으로 처리하게 된다면 하나의 작업이 완료된 후 다음 작업이 실행되기 때문에 효율적이지 못할뿐더러 중간에 정보가 바뀌는 문제가 발생할 수도 있다.
트랜잭션은 이러한 삽입, 갱신, 삭제 등 여러 데이터베이스 작업들을 하나 이상 논리적으로 묶는 것이다.
논리적으로 묶는다는 것이 조금은 이해하기 어려울 수 있는데 간단하게 생각해 보면 만약 회원가입 작업이 있다고 해보자.
회원가입 작업 안에는 읽기와 쓰기 같은 여러 작업들이 있지만 크게 생각해보면 결국에는 회원가입이라는 작업 한 가지를 하는 것이다.
이처럼 여러 데이터베이스 작업들을 회원가입이라는 어떤 논리적인 작업 단위로 만든 것을 바로 트랜잭션이라고 한다.
트랜잭션의 생명주기
트랜잭션의 개념에 대해서 살펴봤을 때 트랜잭션은 하나의 작업 단위라고 했었다.
나는 작업이라는 것은 하나의 라이프사이클, 즉 생명주기가 존재한다고 생각한다.
생각해 보면 지금 정리하는 트랜잭션 외에도 이전에 배웠던 프로세스나 다른 작업들도 마찬가지로 각각의 생명주기를 가지고 있다.
생명주기라는 것은 항상 시작과 끝이 있다는 것이고 그 중간에 여러 작업이 포함된다.
트랜잭션 또한 하나의 작업으로써 특정한 생명주기를 가지게 되는데 어떤 것인지 살펴보자.
위의 그림은 트랜잭션의 생명주기를 보여주는 그림이다. 조금은 복잡해 보일 수 있어서 달리기 시합을 예시로 들어서 설명을 해보려고 한다.
- 활성 상태(Active)
활성 상태는 트랜잭션 실행 중 첫 번째 상태를 의미하며 트랜잭션이 명령(읽기 또는 쓰기 작업)을 수행하고 있는 상태를 의미한다. 즉, 트랜잭션 작업이 돌아가고 있으면 활성 상태인 것이다.
달리기 시합을 보면 출발 지점에서 시작하여 종료지점 전까지 달리는 것을 생각하면 된다.
- 부분 완료 상태(Partially Committed)
부분 완료 상태는 트랜잭션이 성공적으로 실행은 됐지만 아직 데이터베이스에 변경 사항을 커밋(Commit) 하지 않은 상태를 의미한다.
부분 완료 상태에서는 데이터를 메모리 버퍼에 저장되고 해당 버퍼는 아직 디스크에 기록하지 않는다.
예를 들면 달리기 경주에서 끝까지 달렸지만 아직 기록 측정이 완료되지 않은 상황이다.
- 완료 상태(Committed)
모든 트랜잭션 업데이트가 데이터베이스에 영구적으로 저장된 상태로 이 지점 이후에는 트랜잭션을 롤백할 수 없다.
예를 들면 달리기 경주가 끝나고 기록이 측정된 상황을 생각해 보면 된다. 각 사람마다 달라기 기록이 나오고 해당 기록은 그 이후에 바뀌지 않는다.
- 실패 상태(Failed)
실패 상태는 트랜잭션이 실패하거나 활성 상태 또는 부분 완료 상태에서 중단된 경우를 의미한다.
예를 들면 달리기 시합에서 부정 출발을 하거나 달리기 도중에 부상을 당하는 상황이다.
- 종료 상태(Terminated)
부분 완료 또는 실패 상태 이후의 마지막 상태로 최종 트랜잭션 상태를 의미한다. 해당 상태가 트랜잭션 생명주기의 끝이다.
예를 들면 달리기 시합이 끝나고 모든 기록이 측정되어 경기를 종료하는 상황이다.
- 철회(Abort)
트랜잭션이 취소된 상태로 트랜잭션 실행 이전 데이터로 돌아간다.
트랜잭션의 ACID 속성
데이터베이스에서 작업은 원자적이고, 일관적이며 고립되고, 내구성이 있어야 한다. 이러한 속성을 ACID라고 한다.
ACID 속성으로 인해 데이터베이스 트랜잭션이 안정적으로 처리되도록 보장한다.
- Atomicity(원자성)
원자성은 전부 또는 아무것도 없음을 의미한다. 즉, 트랜잭션 내의 작업들이 모두 정상적으로 수행 완료되면 데이터베이스에 반영하고, 반대로 트랜잭션 내의 작업들 중 하나라도 실패하면 전체 트랜잭션이 롤백되고 데이터베이스에 반영하지 않는다.
DBMS가 원자성을 구현하는 방법
- UNDO 로그
트랜잭션이 실패하는 경우 UNDO 로그를 통해 트랜잭션에서 변경한 내용을 되돌릴 수 있다.
트랜잭션이 수정한 데이터들도 디스크에 저장될 수 있으므로 만약 해당 트랜잭션이 어떤 이유든 비정상적으로 종료될 수 없게 되면 트랜잭션이 변경한 데이터들은 원상 복구되어야 한다. 이러한 복구를 UNDO라고 한다.
- REDO 로그
성공적인 트랜잭션이 데이터베이스에 기록될 때 REDO 로그는 변경 사항을 추적한다.
이런 방식으로 트랜잭션이 수집된 후 변경 사항이 기록되기 전에 시스템 장애가 발생하면 Redo 로그를 사용하여 변경 사항을 다시 시도할 수 있다.
커밋한 트랜잭션은 어떠한 경우에도 유지되어야 한다. 이미 커밋한 트랜잭션의 수정을 재반영하는 복구 작업을 REDO라고 한다.
- 2단계 커밋
분산 데이터베이스 환경에서 데이터가 저장될 때 분산 시스템의 모든 노드가 트랜잭션을 수락하거나 중단하도록 보장한다. 이를 통해 원자성을 보장하면서 동시에 일관된 상태를 유지할 수 있다.
- Locking
한 번에 하나의 트랜잭션만 특정 데이터를 수정할 수 있도록 보장한다.
트랜잭션 간의 데이터 충돌을 피하는 데 도움이 되며 데이터 무결성을 유지하는 데도 도움이 된다.
- Consistency(일관성)
일관성은 데이터가 미리 정의된 규칙에 의해서만 수정이 가능한 특성이다.
트랜잭션 수행이 보존해야 할 일관성은 기본 키, 외래 키 제약과 같은 명시적인 무결성 제약 조건들 뿐만 아니라 송금 예시와 같이 두 계좌 잔고의 합은 송금 전후가 같아야 한다는 비명시적인 일관성 조건들이 있다.
- Isolation(독립성 = 격리성)
동시에 여러 개의 트랜잭션이 실행되는 경우 각 트랜잭션은 동시에 실행되는 다른 트랜잭션에 영향을 미치지 않고 독립적으로 유지되어야 한다. 이러한 독립성을 보장하지 않으면 트랜잭션은 원래 상태로 돌아갈 수 없다.
독립성을 보장할 수 있는 가장 간단한 방법은 모든 트랜잭션을 순차적으로 수행하는 것이다.
하지만 병렬적인 수행의 장점을 얻기 위해서 DBMS는 트랜잭션을 병렬적으로 처리하면서도 순차적 수행과 같은 결과를 보장할 수 있는 방식을 제공한다.
- Durability(지속성)
지속성은 성공적인 트랜잭션 커밋이 영구적으로 유지된다는 것을 의미한다. 이로 인해서 시스템 장애가 발생하더라도 저장된 트랜잭션이 보존되도록 보장한다.
성공적인 트랜잭션마다 데이터베이스 트랜잭션 로그에 항목이 추가된다.
DBMS가 데이터 영속성을 보장하기 위해 작동하는 방법
- 데이터 복제
여러 노드 또는 서버에 동일한 데이터의 여러 사본을 유지한다.
재해나 기술적 문제가 발생하더라도 데이터베이스에 있는 기존 데이터는 보존된다.
- 미리 쓰기 로깅
변경 사항이 있을 때 트랜잭션 변경 사항은 먼저 커밋 로그라는 추가 전용 파일에 로드된다.
트랜잭션이 검증되면 변경 사항은 데이터베이스 자체에 기록된다.
- 체크포인팅
데이터베이스의 현재 상태를 주기적으로 디스크에 기록하여 저장된 트랜잭션 변경 사항이 영구적으로 저장되도록 한다.
- RAID
여러 드라이브를 단일 논리 단위로 통합하는 데 사용된다.
트랜잭션의 중요성
- 데이터 무결성
트랜잭션은 데이터베이스의 일관성을 유지하여 데이터 무결성을 보장한다.
원자성을 통해 트랜잭션에서 수행한 모든 변경 사항이 적용되거나 적용되지 않음을 보장한다.
- 동시성 제어
트랜잭션 간에 격리를 제공함으로써 데이터베이스 시스템은 동시 트랜잭션 간의 간섭을 방지하여 각 트랜잭션이 데이터베이스의 일관된 뷰를 볼 수 있도록 한다.
- 복구 및 장애 허용
트랜잭션 실행 중에 시스템 장애가 발생하면 데이터베이스는 트랜잭션을 롤백하고 데이터베이스를 일관된 상태로 복원하여 데이터 무결성을 유지할 수 있다.
- 성능 최적화
여러 데이터베이스 작업을 단일 트랜잭션으로 그룹화함으로써 데이터베이스 시스템은 디스크 쓰기 횟수를 최소화하고 리소스 활용을 최적화하여 전반적인 시스템 효율성을 개선할 수 있다.
- 일관성
트랜잭션 내에서 관련 데이터베이스 작업을 캡슐화하여 이러한 작업이 일관된 단위로 함께 수행되도록 보장하고 데이터 일관성을 유지하며 비즈니스 로직을 준수할 수 있다.
참고 자료
'CS > 데이터베이스' 카테고리의 다른 글
데이터베이스 - 고립화 수준과 이상 현상 (2) | 2024.08.05 |
---|---|
데이터베이스 - 동시성 제어 (0) | 2024.08.05 |
데이터베이스 - ERD (0) | 2024.08.01 |
데이터베이스 - Key (0) | 2024.08.01 |
[DB] - 대규모 데이터 처리 (0) | 2024.06.12 |