예전에 프로젝트를 할때,
방문자수 카운트쿼리를 실행하다가 Dead lock이 걸리면서 서버가 죽어버리는 경험을 했었다..
그때 해결한 방법인 트랜잭션 격리 수준에 대해 기록하려한다.
트랜잭션의 격리 수준(Transaction Isolation Level)은,
여러 트랜잭션이 동시에 처리될 때 특정 트랜잭션이 다른 트랜잭션에서 조회, 변경되는 데이터의 접근을 허용할지 말지를 레벨에 따라서 나누고 있다.
일단 트랜잭션에는 ACID를 만족해야하는데 여기서 Isolation 격리성을 보장하려면 동시에 처리되는 트랜잭션을 차례대로 실행해야하지만 성능저하의 문제로 격리 수준이 4단계로 나누어져 있다.
- READ UNCOMMITTED(커밋되지 않은 읽기)
- READ COMMITTED(커밋된 읽기)
- REPEATABLE READ(반복 가능한 읽기)
- SERIALIZABLE(직렬화 가능)
READ UNCOMMITTED: 트랜잭션에서 처리한 작업이 commit 되기 전이어도 다른 트랜잭션에서 볼 수 있는 Dirty Read 현상이 허용되는 격리 수준.
READ COMMITTED: 가장 많이 사용하는 격리 수준. Dirty Read는 발생하지 않지만 쿼리를 조회할때 하나의 트랜잭션에서 항상 같은 결과를 보장하지 못한다.(NON-REPEATABLE READ)
REPEATABLEREAD: 트랜잭션안에서 한번 조회한 데이터는 항상 동일한 결과가 나온다.
SERIALIZABLE: 가장 엄격한 격리수준으로 읽기작업도 잠금.
'DB' 카테고리의 다른 글
postgreSQL Replication (0) | 2023.12.12 |
---|---|
MySQL 옵티마이저 (Optimizer) Explain (0) | 2022.05.10 |