← 질문 목록
#30깊이 0

격리 수준을 올리면 무엇을 잃는가?

데이터베이스심화트랜잭션

동시성을 잃는다. 위로 올라갈수록 막아주는 현상이 늘지만 그만큼 잠금을 오래 넓게 쥔다. 무엇을 막고 싶은지가 아니라 무엇을 견딜 수 있는지로 고른다.

  • Serializable전부 막는다. 대신 충돌하면 트랜잭션이 취소된다
  • Repeatable Read읽은 행이 중간에 바뀌는 것까지. 없던 행이 끼어드는 것은 못 막는다
  • Read Committed커밋 안 된 값 읽기까지. 같은 질의가 두 번 다를 수 있다

기본값은 대개 Read Committed다. 대부분의 화면은 조금 어긋난 값을 견딘다. 잔액을 읽어 검사하고 쓰는 자리처럼 읽은 값을 근거로 판단할 때만 위로 올린다.

올리는 것 말고 다른 길도 있다. select ... for update로 그 한 줄만 잠그거나, 버전을 두고 커밋 때 확인하는 방식이다. 범위를 좁게 잡으면 수준을 올리지 않고도 같은 것을 지킬 수 있다.

Serializable도 구현에 따라 충돌한 트랜잭션 한쪽을 취소한다. 전부 줄 세우는 것이 아니라 충돌을 감지해 한쪽을 취소하는 방식이다. 그래서 애플리케이션에 재시도 코드가 있어야 한다.

추천 꼬리질문

0/300

적은 내용은 AI 학습에 쓰일 수 있습니다. 이름이나 연락처는 넣지 말아 주세요.

관련 질문

격리 수준을 올리면 무엇을 잃는가?