Dev/DB, SQL

[DB] 트랜잭션 격리 수준

헝그리둘기 2025. 10. 30. 16:02

DB의 트랜잭션 안정성을 보장하기 위한 ACID 속성 중, Isolation (독립성)과 관련 있는 트랜잭션 격리 수준에 대해 알아보았다.

 

격리 수준은 1~4단계이고, 격리수준이 높을수록 데이터를 읽을때 일관성이 보장되지만, 그만큼 락을 오래 물고있기 때문에 동시성(처리 성능)은 떨어진다.

때문에 성능이 중요한지 데이터 정확성이 중요한지 판단해서 격리 수준을 설정해야 한다.

Mysql과 같은 대중적인 RDBMS의 기본 격리 수준은 2단계나 3단계이다.

 

수준 발생할 수 있는 현상 내용
1. Read Uncommitted Dirty Read
Non-repeatable Read
Phantom Read
가장 낮은 격리 수준. 다른 트랜잭션의 커밋되지 않은 데이터를 읽는 것을 허용합니다. (성능은 빠르지만, 데이터 오염 위험이 매우 높음)
2. Read Committed Non-repeatable Read
Phantom Read
Dirty Read를 방지합니다. 트랜잭션은 커밋된 데이터만 읽을 수 있습니다. (대부분의 데이터베이스 기본 설정)
3. Repeatable Read Phantom Read Dirty Read와 Non-repeatable Read를 방지합니다. 트랜잭션이 시작된 후에는 같은 행을 몇 번 읽어도 항상 동일한 결과를 보장합니다.
4. Serializable 없음 (모두 방지) 가장 높은 격리 수준. 모든 동시성 문제를 방지하며, 트랜잭션들이 마치 순차적으로 실행된 것처럼 완벽하게 독립성을 보장합니다. (성능 저하가 가장 심함)

 

- Dirty Read: A 트랜잭션이 B 트랜잭션에서  아직 커밋되지 않은 데이터를 읽는 현상. B트랜잭션이 아직 끝나지 않았기 떄문에 최종 커밋될지, 롤백될지 모르는 데이터를 A트랜잭션이 미리 읽어버림

 

- Non-repeatable Read: A 트랜잭션이 데이터를 읽은 후, B 트랜잭션이 끝나서 커밋을 쳐버렸는데, A 트랜잭션에서 한번 더 동일 데이터를 읽으면 첫번째 데이터와 두번째 데이터가 다르기 때문에 문제가 될 수 있음

 

- Phantom Read: A 트랜잭션이 데이터를 읽은 후, B 트랜잭션이 새로운 데이터를 삽입/삭제 후 커밋을 쳐버렸는데, A 트랜잭션에서 한번 더 동일 데이터를 읽으면 새 데이터로 대체되었거나, 없는 데이터이기 때문에 문제가 될 수 있음

 

 

 (출처 Gemini 2.5 Flash)