← 질문 목록
#30깊이 0
격리 수준을 올리면 무엇을 잃는가?
동시성을 잃는다. 위로 올라갈수록 막아주는 현상이 늘지만 그만큼 잠금을 오래 넓게 쥔다. 무엇을 막고 싶은지가 아니라 무엇을 견딜 수 있는지로 고른다.
- Serializable전부 막는다. 대신 충돌하면 트랜잭션이 취소된다
- Repeatable Read읽은 행이 중간에 바뀌는 것까지. 없던 행이 끼어드는 것은 못 막는다
- Read Committed커밋 안 된 값 읽기까지. 같은 질의가 두 번 다를 수 있다
기본값은 대개 Read Committed다. 대부분의 화면은 조금 어긋난 값을 견딘다. 잔액을 읽어 검사하고 쓰는 자리처럼 읽은 값을 근거로 판단할 때만 위로 올린다.
올리는 것 말고 다른 길도 있다. select ... for update로 그 한 줄만 잠그거나, 버전을 두고 커밋 때 확인하는 방식이다. 범위를 좁게 잡으면 수준을 올리지 않고도 같은 것을 지킬 수 있다.
Serializable도 구현에 따라 충돌한 트랜잭션 한쪽을 취소한다. 전부 줄 세우는 것이 아니라 충돌을 감지해 한쪽을 취소하는 방식이다. 그래서 애플리케이션에 재시도 코드가 있어야 한다.
추천 꼬리질문
관련 질문
- 트랜잭션 격리 수준을 결정하는 기준은 무엇인가?데이터베이스트랜잭션 격리 수준 결정 기준과 그에 따른 트레이드오프(성능 및 정합성)를 함께 다룹니다.
- 낙관적 락과 비관적 락은 무엇으로 고르는가?데이터베이스락을 통한 동시성 제어 방식의 선택은 트랜잭션 격리 수준에 따른 일관성 및 성능 트레이드오프와 밀접하게 연관된다.
- 읽기만 하는데도 잠금이 걸리는 경우가 있는가?데이터베이스읽기에 잠금이 걸리는지가 격리 수준이 정하는 일이다.
- 데이터베이스 격리 수준을 높이면 전체 처리량은 어떻게 변화하는가?데이터베이스
- 메시지 큐를 두면 무엇을 얻고 무엇을 잃는가?아키텍처 · 분산시스템