DB/이론

[DB] Transaction 격리 수준 종류 (Isolation Level)

yubi5050 2022. 8. 10. 17:52

Transaction 격리 수준 이란?

Transaction이 동시에 처리될 때 transaction끼리 얼마나 고립되어 있는지를 나타냄

RDBMS는 transaction의 격리 수준을 제어 가능하며 일반적인 DBMS는 READ COMMITTED나 REPEATABLE READ를 사용 (oracle, postgresql - READ COMMITTED  /  mysql - REPEATABLE READ)

 

격리 수준은 아래 4가지로 구분되며, 번호가 높아질 수록 트랜잭션간 고립 정도 ↑, 성능 ↓

  • 1) READ UNCOMMITTED
  • 2) READ COMMITTED
  • 3) REPEATABLE READ
  • 4) SERIALIZABLE

 

READ UNCOMMITTED

트랜잭션(A)의 변경내용이 COMMIT이나 ROLLBACK 여부와 상관없이 다른 트랜잭션(B, C..)에서 보여지는 상황

1. A 트랜잭션에서 유저G 의 나이를 20살에서 21살로 변경
2. 아직 A 트랜잭션은 COMMIT 되지 않음
3. B 트랜잭션이 유저G의 나이 조회
4. B 트랜잭션에서 21살이 조회됨 (Dirty Read 현상)
5. A 트랜잭션이 문제가 생겨 ROLLBACK 함
6. B 트랜잭션은 여전히 21살이라고 생각하고 로직을 수행

READ UNCOMMITTED 예제 그림. 출처 : https://techblog.yogiyo.co.kr/db-concurrency-%EC%96%B4%EB%94%94%EA%B9%8C%EC%A7%80-%EC%95%8C%EA%B3%A0-%EC%9E%88%EB%8B%88-559bfc4f59ee

 

READ COMMITTED

트랜잭션의 변경 내용이 COMMIT 되어야만 다른 트랜잭션에서 조회 가능 (가장 많이 선택되는 격리수준)

1. A 트랜잭션에서 유저G 의 나이를 20살에서 21살로 변경
2. 아직 A 트랜잭션은 COMMIT 되지 않음
3. B 트랜잭션이 유저G의 나이 조회
4. B 트랜잭션에서 20살이 조회됨
5. A 트랜잭션이 변경을 완료하고 COMMIT을 완료함
6. B 트랜잭션은 유저G의 나이 재조회
7. B 트랜잭션에서 21살이 조회됨

하나의 트랜잭션에서 같은 SELECT를 수행했지만, 다른 결과를 반환 => NON-REPEATABLE READ 문제 발생

※ 일반적인 웹 서비스는 괜찮지만, 데이터를 보여주는 것에 민감한 서비스에서는 주의 필요

READ COMMITTED 예제 그림. 출처 : https://techblog.yogiyo.co.kr/db-concurrency-%EC%96%B4%EB%94%94%EA%B9%8C%EC%A7%80-%EC%95%8C%EA%B3%A0-%EC%9E%88%EB%8B%88-559bfc4f59ee

 

REPETABLE READ

자신의 트랜잭션 번호보다 이전의 트랜잭션 번호 커밋 사항만 바라보는 것

1. A 트랜잭션에서 유저G 의 나이를 20살에서 21살로 변경
2. A 트랜잭션이 변경을 완료하고 COMMIT을 완료함
3. B 트랜잭션이 유저G의 나이 조회
4. B 트랜잭션에서 21살이 조회됨

REPEATABLE READ 예제 그림. 출처 : https://techblog.yogiyo.co.kr/db-concurrency-%EC%96%B4%EB%94%94%EA%B9%8C%EC%A7%80-%EC%95%8C%EA%B3%A0-%EC%9E%88%EB%8B%88-559bfc4f59ee

 

 

문제점 : Phantom Read (한 트랜잭션 내에 같은 쿼리를 여러번 실행시, 이전 쿼리시에는 없던 레코드가 없어지거나 나타나는) 현상 발생

1. A 트랜잭션에서 유저G 정보 ID값 2로 조회
2. A 트랜잭션에서 유저G 정보 조회 성공
3. B 트랜잭션이 유저G의 ID값 수정 (2=>1)
4. A 트랜잭션이 유저G정보 ID값 2로 재요청 => REPETABLE READ에 따르면 똑같이 1건이 조회되어야 하지만, 데이터가 없어 조회 못함. (=Phantom READ 현상)

 

 

SERIALIZABLE

가장 엄격한 수준의 격리로 읽기 작업에도 공유 잠금을 설정하며 다른 트랜잭션에서 해당 값 변경 불가
동시처리 능력이 다른 격리수준보다 떨어지고, 성능저하 발생

 

 

비교

  DIRTY READ NON-REPEATABLE READ PHANTOM READ
READ UNCOMMITTED O O O
READ COMMITTED X O O
REPEATABLE READ X X O
SERIALIZABLE X X X

 

 

참고문헌

'DB > 이론' 카테고리의 다른 글

[DB] Replication 이란? (Feat. Mysql, Mongo)  (0) 2022.10.03
[DB] Index란?  (0) 2022.08.11
[DB] PostgreSQL vs MySQL  (0) 2022.08.10
[DB] ORM 이란?  (0) 2022.06.02
[DB] SQL vs NoSQL 차이점  (0) 2022.05.17