트랜잭션
트랜잭션은 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미합니다!
트랜잭션의 특징 (ACID)
원자성 (Atomicity)
원자성은 트랜잭션의 모든 작업이 하나의 불가분한 단위로 처리됨을 의미합니다. 즉, 트랜잭션 내에서 수행되는 여러 작업들이 개별적으로 실행되는 것이 아니라, 하나의 단위로 묶여서 전체가 모두 성공하거나 모두 실패해야 합니다.
예를 들어, 은행 계좌 이체를 생각해보면 계좌 A에서 돈을 빼고, 계좌 B로 돈을 입금하는 두 가지 작업이 하나의 트랜잭션으로 묶여있습니다! 원자성은 이 두 작업이 모두 성공해야만 트랜잭션이 성공으로 간주되고, 하나라도 실패하면 전체 트랜잭션이 실패하여 이전 상태로 복구된다는 것을 보장합니다. 즉, 중간 상태는 없으며, 트랜잭션이 실행되기 전의 상태로 되돌아가게 됩니다.
이렇게 함으로써 데이터베이스는 항상 일관된 상태를 유지하며, 사용자는 중간에 오류가 발생했더라도 일관되지 않은 데이터 상태를 마주치지 않게 됩니다. 원자성의 중요한 부분은 시스템 오류, 충돌 또는 기타 예상치 못한 문제로 인해 트랜잭션의 일부만 실행되는 상황을 방지하는 것입니다!
일관성 (Consistency)
트랜잭션이 완료되면 데이터베이스는 항상 유효한 상태를 유지해야 합니다. 이는 데이터 무결성 제약 조건 (예: 기본 키, 외래 키, 고유 제약 조건 등)을 항상 충족시켜야 한다는 것을 의미합니다. 일관성은 트랜잭션이 시스템의 비즈니스 규칙을 위반하지 않도록 보장합니다.
격리성 (Isolation)
여러 트랜잭션이 동시에 실행되더라도 서로 간섭하지 않도록 보장해야 합니다. 트랜잭션 격리 수준은 이러한 격리성의 정도를 조정합니다. 각각의 격리 수준은 다음과 같은 특징을 갖습니다:
- READ UNCOMMITTED (커밋되지 않은 읽기): 트랜잭션이 커밋되지 않은 데이터도 읽을 수 있습니다. 이로 인해 "더티 리드(Dirty Read)"가 발생할 수 있습니다.
- READ COMMITTED (커밋된 읽기): 커밋된 데이터만 읽을 수 있습니다. 이는 "더티 리드"를 방지하지만, "논리적 불일치(Non-repeatable Read)" 문제가 발생할 수 있습니다.
- REPEATABLE READ (반복 가능한 읽기): 트랜잭션이 시작된 시점의 데이터를 계속해서 읽을 수 있습니다. 이로 인해 "논리적 불일치"는 발생하지 않지만, "팬텀 리드(Phantom Read)"가 발생할 수 있습니다.
- SERIALIZABLE (직렬화 가능): 가장 높은 수준의 격리성을 제공하며, 모든 트랜잭션을 직렬적으로 실행되는 것처럼 보이게 합니다. 이는 동시성 문제가 완전히 해결되지만, 성능 저하가 발생할 수 있습니다.
지속성 (Durability)
트랜잭션이 성공적으로 커밋된 후에는 시스템 장애가 발생하더라도 그 결과가 데이터베이스에 영구히 반영되어야 합니다. 이를 위해 데이터베이스는 로그 파일 등을 사용하여 장애 발생 시에도 데이터를 복구할 수 있는 메커니즘을 갖추고 있습니다.
트랜잭션의 Commit 과 Rollback
Commit
하나의 트랜잭션이 성공적으로 끝나서 데이터베이스가 일관성있는 상태에 있음을 의미합니다.
Rollback
트랜잭션의 원자성이 깨질 때, 즉 하나의 트랜잭션 처리가 비정상적으로 종료 되었을 때의 상태를 뜻한다.
Rollback 이 이뤄진다면 트랜잭션을 다시 실행하거나 부분적으로 변경된 결과를 취소할 수 있습니다.
트랜잭션의 상태
트랜잭션은 논리적으로 5가지의 상태가 있습니다
- Active : 트랜잭션이 현재 실행 중인 상태
- Failed : 트랜잭이 실행되다 오류가 발생해서 중단된 상태
- Aborted : 브랜잭션이 비정상 종료되어 Rollback 이 수행된 상태
- Partially Committed : 트랜잭션의 연산이 마지막까지 실행되고 Commit이 되기 직전 상태
- Committed : 트랜잭션이 성공적으로 종료되어 Commit 연산을 실행한 후의 상태
'DB' 카테고리의 다른 글
Redis를 활용한 확장 가능한 세션 관리 전략 (0) | 2024.12.23 |
---|---|
DB 파티셔닝(Partitioning)이란 (2) | 2024.07.22 |
[DB] DDL, DML, DCL, TCL 이란? (0) | 2024.07.21 |
관계형 DB와 비관계형 DB의 차이(RDBMS vs NoSQL) (4) | 2024.07.11 |
[DB] 관계형 데이터베이스의 1:1, 1:N, N:M 관계 (4) | 2024.07.10 |