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 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 문제 발생
※ 일반적인 웹 서비스는 괜찮지만, 데이터를 보여주는 것에 민감한 서비스에서는 주의 필요
REPETABLE READ
자신의 트랜잭션 번호보다 이전의 트랜잭션 번호 커밋 사항만 바라보는 것
1. A 트랜잭션에서 유저G 의 나이를 20살에서 21살로 변경
2. A 트랜잭션이 변경을 완료하고 COMMIT을 완료함
3. B 트랜잭션이 유저G의 나이 조회
4. B 트랜잭션에서 21살이 조회됨
문제점 : 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 |