Serach

2014년 1월 20일 월요일

Transaction-Level Read Consistency (트랜잭션 수준 읽기 일관성)

트랜잭션 수준 읽기 일관성이란?


문장수준 읽기 일관성(Statement-Level Read Consistency)
  • 쿼리가 시작된 시점을 기준으로 데이터를 일관성 있게 읽어 들이는 것

트랜잭션 수준 읽기 일관성(Transaction-Level Read Consistency)
  • 트랜잭션이 시작된 시점을 기준으로 일관성 있게 데이터를 읽어 들이는 것



이상 현상 3가지


  • Dirty Read ( = Uncommitted Dependency )
          커밋되지 않은 수정 중인 데이터를 다른 트랜잭션에서 읽을 수 있도록 허용할때 발생
          대부분 DBMS가 기본 트랜잭션 고립화 수준을 레벨1 로 설정하고 있어 Dirty Read는 발생하지 않음
          =  커밋된 데이터만 읽을 수 있도록 허용
          SQL Server, Sybase등은 데이터를 읽을 때 공유 Lock을 사용,
          갱신중인 레코드에는 배타적 Lock이 걸림, 
          이는 공유 Lock과는 호환되지 않아 갱신중인 레코드는 읽지 못함(Lock에 의한 동시성 저하 발생)
  • Non-Repeatable Read ( = Inconsistent Analysis )
          한 트랜잭션 내에서 같은 쿼리를 두번 수행할 때 그 사이에 다른 트랜잭션이 값을 수정 또는 삭제함으로써
          두 쿼리의 결과가 상이하게 나타나는 비일관성이 발생하는 것을 말함
  • Phantom Read 
          한 트랜잭션 안에서 일정 범위의 레코드를 두번 이상 읽을 때, 
          첫번째 쿼리에서 없던 레코드가 두번째 쿼리에서 나타나는 현상
          이는 트랜잭션 도중 새로운 레코드가 삽입되는 것을 허용하기 때문에 나타나는 현상.



이상현상은 트랜잭션 수준 읽기 일관성(Transaction-Level Read Consistency)때문에 생기는 현상이며
고립화 수준을 조정함으로써 해결 할 수 있다.
하지만 고립화 수준을 높이면 데이터 일관성은 확보 되지만 동시성이 현격히 저하되는 결과를 초래 할 수 있다.


Transaction Isolation Level


트랜잭션 수준으로 읽기 일관성을 강화 하려면 트랜잭션 고립화 수준을 높여 주어야 한다. 
트랜잭션 고립화 수준을 조절하는 방법은 네가지 수준이 있다.
ANSI / ISO SQL standard(SQL92)에서 정의함

■ 레벨 0 ( = Read Uncommitted )
 - 트랜잭션에서 처리중인 / 아직
커밋되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용
 - Dirty Read, Non-repeatable Read, Phantom Read 현상 발생

■ 레벨 1 ( = Read Committed )
 - Dirty Read 방지 :
트랜잭션이 커밋되어 확정된 데이터만 읽는 것을 허용
 -
대부분의 DBMS가 기본모드로 채택하고 있는 일관성 모드
 - Non-Repeatable Read, Phantom Read 현상 발생

■ 레벨 2 ( = Repeatable Read )
 - 선행 트랜잭션이 읽은 데이터는 트랜잭션이 종료될 때까지
후행 트랜잭션이 갱신하거나 삭제하는 것을 불허함으로써 같은 데이터를 두번 쿼리했을 때 일관성 있는 결과를 리턴
 - Phantom Read 현상 발생

■ 레벨 3 ( = Serializable Read )
 - 선행 트랜잭션이 읽은 데이터를 후행 트랜잭션이 갱신하거나 삭제하지 못할 뿐만 아니라 중간에 새로운 레코드를 삽입하는 것도 막아줌
 -
완벽한 읽기 일관성 모드를 제공

댓글 없음:

댓글 쓰기