종류는 잘 알려진대로 아래 4가지.
1. READ UNCOMMITTED
- SELECT 조회 시, 공유락 X
- 커밋되지 않은 데이터를 읽을 수 있다
- 🚨 Dirty Read : 커밋되지 않은 (변경 중인) 데이터를 읽어, 데이터의 무결성이 깨질 수도 있는 현상
- A 트랜잭션이 B 트랜잭션이 건드리고 있는 데이터를 읽고
- 이를 바탕으로 로직을 수행하고 A 트랜잭션은 커밋함
- B 트랜잭션이 갑자기 롤백되버림
- A 트랜잭션 당황.. 난 이미 커밋해버렸는데..? (무결성 와장창)
2. READ COMMITTED
- SELECT 조회 시, 데이터에 공유락 O
- 커밋된 데이터만 읽을 수 있다
- 해당 데이터가 사용되고 있을 때만 공유락이 걸린다
- SELECT 대상이 되는 데이터 row1, row2가 있을 때
- row1을 읽는 순간에는 row1에만 공유락이 걸린다 (다른데서 쓰기 불가능)
- row2를 읽을 차례가 되면 row1의 공유락이 풀려 다른데서 쓰기작업이 가능해진다
- 🚨 Non-repeatable read : 한 트랜잭션에서 같은 쿼리를 두 번 수행할 때 같은 레코드에 대해 다른 결과 값을 읽는다
- A 트랜잭션 : row1 읽음
- B 트랜잭션 : A가 다 읽고난 뒤 row1 수정하고 커밋
- A 트랜잭션 : row1 다시 읽는데 처음 읽었을 때랑 다름 (A 트랜잭션 당황)
3. REPEATABLE READ
- SELECT 조회 시, 데이터에 공유락 O
- 트랜잭션이 수행되는 동안에는 조회하는 데이터의 내용이 항상 동일하다는 것을 보장해준다
- SELECT에서 건드리는 모든 데이터에 공유락이 걸린다
- SELECT 대상이 되는 데이터 row1, row2가 있을 때 둘 다 공유락이 걸린다
- 해당 트랜잭션이 데이터를 다 읽을 때까지 다른 트랜잭션은 해당 데이터 못건드림
- 🚨 Phantom read : 한 트랜잭션에서 같은 쿼리를 두 번 수행할 때 이전에 없던 레코드가 읽히는 것
- A 트랜잭션 : table 1 읽음 (총 10개)
- B 트랜잭션 : table 1에 레코드 추가
- A 트랜잭션 : table 1 읽음 (총 11개) ...? (A 트랜잭션 당황.. 없던게 생겼네 귀신인가)
4. SERIALIZABLE
- SELECT 조회 시, 관련 테이블에 공유락 O
- 트랜잭션이 수행되는 동안 완벽하게 일관적인 조회를 보장
- 대신 성능 문제 발생
아래로 내려갈수록,
- 격리수준, 고립성, 무결성 UP
- 동시성, 성능 DOWN
Reference
https://stackoverflow.com/a/16162426
https://hleee.medium.com/%EA%B2%A9%EB%A6%AC-%EC%88%98%EC%A4%80-3287d4bcc64d