1. 트랜잭션(Transaction)
트랜잭션은 데이터베이스에서 하나의 논리적인 작업 단위를 의미합니다.
트랜잭션은 모두 수행되거나(Commit), 하나도 수행되지 않아야(Rollback) 데이터의 일관성을 유지할 수 있기 때문에 트랜잭션은 데이터베이스의 신뢰성과 무결성을 보장하는 핵심 개념입니다.
■ 트랜잭션이 왜 필요한가요?
트랜잭션은 예기치 못한 시스템 장애나 동시성 문제로부터 데이터의 무결성을 보호하기 위해 필요합니다.
예를 들어, 현금 인출 도중 정전이 발생하거나, 두 사용자가 동시에 같은 계좌를 인출할 경우 데이터가 꼬일 수 있습니다. 이러한 상황에서 트랜잭션을 사용하면, 중간에 문제가 생겨도 전체 작업을 되돌릴 수(Rollback) 있기 때문에 데이터의 정합성과 일관성을 유지할 수 있습니다.
또한, 동시 처리로 인해 방생할 수 있는 충돌을 격리(Isolation)하여 안정적인 시스템을 유지하게 합니다.
■ 트랜잭션의 ACID 속성
- Atomicity(원자성): 트랜잭션 내 연산은 모두 성공하거나 모두 실패하는 것으로 부분 성공은 허용하지 않습니다.
- Consistency(일관성): 트랜잭션이 완료된 후에는 항상 데이터베이스가 일관된 상태여야 합니다.
- Isolation(격리성): 트랜잭션이 수행되는 중간에는 다른 트랜잭션이 해당 데이터에 접근할 수 없습니다.
- Durability(지속성): 트랜잭션이 Commit 되면, 그 결과는 영구적으로 저장되어 시스템 장애가 발생해도 유지됩니다.
■ Commit & Rollback
- Commit: 트랜잭션이 모든 연산을 성공적으로 마쳤을 때, 그 결과를 데이터베이스에 영구적으로 반영하는 연산입니다.
- Rollback: 트랜잭션 처리 도중 오류가 발생하거나 실패했을 때, 그 트랜잭션이 실행한 모든 작업을 취소하고 이전 상태로 되돌리는 연산입니다.
이러한 기능을 통해 데이터의 일관성과 원자성을 보장할 수 있습니다.
■ 트랜잭션의 상태 변화 과정
- Active(활동 중): 트랜잭션이 실행 중이며 연산이 수행되는 상태입니다.
- Partially Committed(부분 완료): 트랜잭션이 마지막 명령까지 수행되었지만 아직 Commit되지 않은 상태입니다.
- Committed(완료): 트랜잭션이 성공적으로 종료되어 데이터가 반영된 상태입니다.
- Failed(장애 발생): 실행 중 오류가 발생한 상태입니다.
- Aborted(철회): 트랜잭션이 Rollback되어 작업이 모두 취소된 상태입니다.
이러한 상태 관리를 통해 데이터의 신뢰성과 무결성을 보장할 수 있습니다.
2. 트랜잭션 격리 수준(Transaction Isolation Level)
트랜잭션 격리 수준은 동시에 여러 트랜잭션이 실행될 때, 서로 간섭하지 않도록 하기 위한 설정 단계입니다. 이는 트랜잭션 간 데이터의 일관성을 얼마나 보장할 것인지에 대한 수준을 결정합니다.
격리 수준이 높을수록 데이터의 무결성과 일관성이 강하게 보장되지만, 동시성이 낮아지고 성능 저하가 발생할 수 있습니다. 반면, 격리 수준이 낮을수록 성능은 높아지지만, 일관성 문제가 발생할 수 있어 트레이드 오프가 존재합니다.
■ Isolation Level 발생 현상
- Dirty Read: 아직 커밋되지 않은 데이터를 읽는 현상
- Non-Repeatable Read: 같은 데이터를 두 번 조회했을 때 값이 바뀌는 현상
- Phantom Read: 조회 범위 내에서 처음에는 없던 레코드가 나중에 생기는 현상
■ Isolation Level
격리 수준 | Dirty Read | Non-Repeatable Read | Phantom Read |
Read Uncommitted (Level 0) | ✅ 발생 | ✅ 발생 | ✅ 발생 |
Read Committed (Level 1) | ❌ 차단 | ✅ 발생 | ✅ 발생 |
Repeatable Read (Level 2) | ❌ 차단 | ❌ 차단 | ✅ 발생 |
Serializable (Level 3) | ❌ 차단 | ❌ 차단 | ❌ 차단 |
- Read Uncommitted (레벨 0) - 읽기 미확정
가장 낮은 수준의 격리 단계로 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽을 수 있습니다. Dirty Read가 발생할 수 있어 데이터 정합성이 가장 낮습니다. 따라서 성능은 가장 좋지만, 대부분의 실무에서는 사용하지 않습니다. - Read Committed (레벨 1) - 읽기 확정
커밋된 데이터만 읽을 수 있어 Dirty Read는 방지됩니다. 하지만, 한 트랜잭션 내에서 같은 데이터를 두 번 조회할 때 값이 바뀌는 Non-Repeatable Read는 여전히 발생할 수 있습니다. Oracle, SQL Server의 기본 격리 수준으로, 실무에서 가장 많이 사용됩니다. - Repeatable Read (레벨 2) - 반복 가능 읽기
트랜잭션 중 조회한 데이터에 공유 잠금을 걸어 Non-Repeatable Read도 방지합니다. 하지만, 조회 범위에 새 레코드가 추가되는 Phantom Read는 여전히 발생할 수 있습니다. MySQL InnoDB의 기본 설정이며, 성능과 일관성의 균형이 어느 정도 잡힌 수준입니다. - Serializable (레벨 3) - 직렬화 가능
가장 엄격한 격리 수준으로, 모든 트랜잭션을 순차적으로 실행하는 것처럼 보장하기 때문에 모든 이상 현상(Dirty, Non-Repeatable, Phantom Read)을 방지할 수 있습니다. 대신 성능이 크게 저하되고, 동시성이 떨어진다는 단점이 있습니다. 데이터 무결성이 최우선인 회계 시스템 등에서 사용됩니다.
Isolation Level 조정은 동시성이 증가되는 데에 반해 데이터 무결성에 문제가 발생할 수 있고, 데이터의 무결성을 유지하는 데에 반해 동시성이 떨어질 수 있습니다. 또한 레벨이 높아질수록 비용 또한 높아집니다.
'Computer Science > Databse' 카테고리의 다른 글
[DB] 데이터베이스 풀 (0) | 2025.06.03 |
---|