본문 바로가기

IT 살이/04. 기술 - 인프라

[메모] 트랜잭션 격리 수준 정리

 

  1. Read Uncommitted
    1. 특징
      • Nolock 힌트와 동일
      • Select 구문의 이슈이다.
      • Dirty Read - 다른 Transaction에서 변경이 되었지만 아직 Commit 명령이 아직 수행되지 않은 변경된 데이터(Dirty)를 읽어올 수 있음( 수정불가).
    2. 업무 시나리오
      • Select구문에 대한 후속 작업에서 변경을 가하지 않는 로직에 적용
      • Transaction이 빈번한 테이블에서 빠른 조회가 요구될 때
      • 동시성에 대한 요구가 없는 작업에서
  2. Read Committed
    1. 특징
      • 힌트가 없는 일반 문장
      • 디폴트 격리수준
      • Select 이슈.
      • 다른 Transaction에서 변경 중인 데이터는 읽어 올 수가 없음
        (다른 Transaciton에서 Commit 또는 Rollback 명령이 떨어지지 않는 한 실행된 Select구문은 대기 상태로 들어가게 됨).
    2. 업무 시나리오
      • 대부분의 일반 업무 시나리오.
  3. Repeatable Read
    1. 특징
      • UPDLOCK힌트와 동일
      • 자신의 Transaction의 Select이슈, 다른 Transaction의 Update 이슈
      • 한 트랜잭션내에서 수행하는 select문은 항상 동일한 값을 반환함( 공유잠금유지)
      • 즉, 자신의 Transaction하에서 Select된 로우에 대해 다른 Transaction이 읽어갈 수는 있지만 수정할 수 없음.
      • 다른 Transaction이 같은 테이블의 다른 로우에 대한 변경, 추가, 삭제는 가능
      • select * , 조건절 Select이나 테이블 스캔, 인덱스 스캔인 경우는 해당 테이블에 변경, 삭제가 불가능 하나 추가는 가능
    2. 업무 시나리오
      • 같은 로우에 대한 동시 업데이트가 문제시 되는 업무 시나리오
      • 같은 로우에 대한 Transaction이 빈번한 경우 Select구문에 대한 중요 정책이 필요할 때
      • 예약, 발권 등의 같은 로우에 대한 동시 접근 시나리오.
    3. * Read Uncommitted와의 차이점은?
  4. Serializable
    1. 특징
      • HOLDLOCK힌트와 동일하다.
      • Repeatable Read 특징을 모두 포함.
      • 조건 조회의 경우는 Repeatable Read와 동일
        (해당 로우에 대해 다른 Transaction이 변경,삭제를 할 수 없음)
      • Select *, 조건조회이나 테이블 스캔, 인덱스 스캔의 경우 다른 Transaction에서 해당 테이블에 대해 변경, 삭제, 추가를 할 수 없음.
    2. 업무 시나리오
      • 한 Transaction에서 발생된 Select구문의 데이터에 대한 완벽한 정확성을 반영하고자 할 때
      • 대량의 데이터를 특정 로직으로 변경을 가하는 Import, Export, Bulk Copy 등의 배치 작업에서 데이터의 동시성이 중요시 되는 경우에 사용
      • 해당 테이블에 동시 Transaction 수가 적을 때
      • Transaction이 빈번한 대규모 시스템에서는 성능에 치명적인 영향을 미치므로 주의해서 사용