본문으로 바로가기

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

category 01. 기술 - 인프라 2010.03.29 09:20

 

  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이 빈번한 대규모 시스템에서는 성능에 치명적인 영향을 미치므로 주의해서 사용

댓글을 달아 주세요

  1. Favicon of http://www.sysnet.pe.kr BlogIcon kevin 2010.03.29 11:03 신고

    오랜만에 글 쓰셨네요. ^^

    업무 시나리오와 함께 정리해 주셔서 더 직관적인 것 같습니다. (저같은 경우, 격리 수준은 읽을 때는 알겠는데... 그 이후에는 매번 찾아봐야 한다는. ^^;)

    중간에 "Read uncommited와의 차이점?"이라고 했는데, read commited와의 차이점을 잘못 쓰신 거죠?
    설명하신 것처럼, "read commited"에서는 반복적으로 읽었을 때 다른 값을 반환할 수 있다는 차이가 있는 거 아닌가요?

    아래의 글 한번 읽어보세요. ^^

    About COM+ Transaction Isolation Level
    ; http://www.simpleisbest.net/archive/2005/09/13/235.aspx

티스토리 툴바