트랜잭션 격리 수준(Transaction Isolation Levels)
- 데이터베이스에서 동시에 여러 트랜잭션이 동작할 때, 트랜잭션들 사이에서 어떻게 데이터의 일관성과 격리를 유지할지를 정의하는 개념
- 데이터베이스 시스템은 보통 다양한 격리 수준을 제공하여 사용자가 필요에 맞게 선택할 수 있도록 한다.
1. READ UNCOMMITTED
- 한 트랜잭션에서 변경한 데이터가 커밋되지 않더라도 다른 트랜잭션에서 해당 데이터를 읽을 수 있음
- 이로 인해 Dirty Read(더티 리드), Non-Repeatable Read(비반복 가능한 읽기), Phantom Read(유령 읽기)와 같은 문제가 발생할 수 있다.
- 이러한 문제들로 인해 READ UNCOMMITTED 격리 수준은 일반적으로 사용되지 않는다.
2. READ COMMITTED
- 한 트랜잭션이 변경한 데이터가 커밋되어야만 다른 트랜잭션에서 해당 데이터를 읽을 수 있다.
- 이로 인해 Dirty Read는 방지되지만, Non-Repeatable Read와 Phantom Read 문제는 여전히 발생할 수 있다.
3. REPEATABLE READ
- 한 트랜잭션이 읽은 데이터를 다른 트랜잭션이 변경하더라도, 해당 트랜잭션이 종료될 때까지 같은 데이터를 읽을 수 있다.
- 이로 인해 Non-Repeatable Read는 방지되지만, 여전히 Phantom Read 문제가 발생할 수 있다.
4. SERIALIZABLE
- 가장 높은 격리 수준으로, 모든 트랜잭션들이 순차적으로 실행되는 것처럼 보장.
- 따라서 Dirty Read, Non-Repeatable Read, Phantom Read 모두 방지
- 하지만 이 격리 수준은 동시성 처리를 위해 트랜잭션을 직렬화하기 때문에 성능 저하가 발생할 수 있다.
각 격리 수준은 자신만의 장단점이 있으며, 데이터의 일관성과 동시성 처리 사이에 적절한 균형을 맞추는 것이 중요!
보통은 READ COMMITTED 또는 REPEATABLE READ 격리 수준이 기본적으로 사용되며, 특정 상황에 따라 SERIALIZABLE 격리 수준을 선택할 수 있다.
트랜잭션 과정💡
1. 시작 (BEGIN 또는 START TRANSACTION):
트랜잭션을 시작하는 단계
2. 작업 수행 (INSERT, UPDATE, DELETE 등):
트랜잭션에서 원하는 작업을 수행한다. 이 단계에서 데이터베이스의 상태가 변경된다. (보통의 예시: 하지만 아직 커밋되지 않았으므로, 다른 트랜잭션에서 이 변경 내용을 볼 수 없다.)
3. 커밋 (COMMIT):
트랜잭션이 성공적으로 완료되었을 때, COMMIT 명령을 실행하여 트랜잭션을 커밋한다. 이때 변경된 데이터가 데이터베이스에 반영된다. (보통의 예시: 커밋 이후에는 다른 트랜잭션들이 해당 변경 내용을 읽을 수 있다.)
4. 롤백 (ROLLBACK):
트랜잭션 중에 오류가 발생하거나 명시적으로 롤백 명령을 실행하면, 트랜잭션이 취소되고 이전 상태로 롤백된다. 즉, 트랜잭션이 시작하기 전의 데이터베이스 상태로 되돌린다.
[데이터베이스] 트랜잭션의 ACID 성질 - 하나몬
트랜잭션이란 여러 개의 작업을 하나로 묶은 실행 유닛을 말한다. 데이터베이스 트랜잭션은 ACID라는 특성을 가지고 있다. ACID는 데이터베이스 내에서 일어나는 하나의 트랜잭션(transaction)의 안
hanamon.kr
'DB' 카테고리의 다른 글
[DB] 면접 예상 질문(2) (0) | 2023.08.06 |
---|---|
[DB] Redis의 영속성과 복구: 스냅샷과 AOF란? (0) | 2023.08.01 |
[DB] 검색 엔진: 역색인(Inverted Index) 구조란? (0) | 2023.07.31 |
[DB] NOSQL 특징: 분산 확장성 (0) | 2023.07.31 |
[DB] 면접 예상 질문(1) (0) | 2023.07.31 |