02.트랜잭션 수준 읽기 일관성

h3.(1) 트랜잭션 수준 읽기 일관성이란?

  • 문장수준 읽기 일관성 (Statement-Level Read Consistency)은 쿼리가 시작된 시점을 기준으로 데이터를 일관성 있게 읽어들이는 것을 말한다.
  • 트랜잭션이 진행되는 동안 다른 트랜잭션에 의해 변경사항이 발생하더라도 이를 무시하고 계속해서 일관성 있는 데이터를 보여준다

h3.(2) 트랜잭션 고립화 수준

  • 오라클은 완벽한 문장수준의 읽기 일관성을 보장하지만 트랜잭션에 대해서는 기본적 으로 보장하지 않는다.
  • 다른 DBMS도 트랜잭션 수준의 읽기 일관성은 보장하지 않는다.
  • 트랜잭션수준으로 읽기 일관성을 강화하려면 트랜잭션 고립화 수준을 높여 주어야한다.
  • ANSI/ISO SQL standard(SQL92)에서 정의하고 있는 아래 네 가지 트랜잭션 고립화
  1. 레벨 0 ( = Read Uncommitted )
  • 트랜잭션에서 처리 중인 아직 커빗되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용
  • Dirty Read, Non-Repeatable Read, Phantom Read 현상 발생
  • Oracle은 이 레벨을 지원하지 않음
  1. 레벨 1 ( = Read Commitled )
  • Dirty Read 방지 : 트랜잭션이 커멋되어 확정된 데이터만 읽는 것을 허용
  • 대부분의 DBMS가 기본모드로 채택하고 있는 일관성 모드
  • Non - Repeatable Read, Phantom Read 현상은 여 전히 발생
  • DB2, SQL Server, Sybase의 경우 읽기 공유 Lock을 이용해서 구현. 하나의 레코
    드를 읽을 때 Lock을 설정하고 해당 레코드를 빠져 나가는 순간 Lock 해제
  • Orac1e은 Lock을 사용하지 않고 쿼리시작 시점의 Undo 데이터를 제공하는 방식으
    로구현
  1. 레벨 2 ( = Repeatable Read )
  • 선행 트랜잭션이 읽은 데이터는 트랜잭션이 종료될 때까지 후행 트랜잭션이 갱신하
    거나 삭제하는 것을 불허함으로써 같은 데이터를 두 번 쿼리했을 때 일관성 있는 결
    과를리턴
  • Phantom Read 현상은 여전히 발생
  • DB2, SQL Server의 경우 트랜잭션 고립화 수준을 Repeatable Read로 변경하면
    읽은 데이터에 걸린 공유 Lock을 커빗할 때까지 유지한 방식으로 구현
    Orac1e은 이 레벨을 명시적으로 지원하지 않지만 for update절을 이용해 구현가능.
    SQL Server 등에서도 for update절을 사용할 수 있지 만 커서를 명시적으로 선언할
    때만사용가능함
  1. 레벨 3 (= serializable Read)
  • 선행 트랜잭션이 읽은 데이터를 후행 트랜잭션이 갱신하거나 삭제하지 못할 뿐만 아
    니라 중간에 새로운 레묘드를 삽입하는 것도 막아줌
  • 완벽한 읽기 일관성 모드를 제공

DBMS에서 제공하는 트랜잭션 고립화 수준 조정기능


set transaction isolation level serializable;

h3.(3) Dirty Read(= UncommiUed Dependency)

  • 아직 커빗되지 않은 수정 중인 데이터 를 다른 트랜잭션에서 읽을 수 있도록 허용할 때 발생한다.
  • 만약 Dirty Read를 허용하는 상황에서 아래 문장이 수행되는 도중에 다른 트랜잭션에 의해 특정 계좌의 잔고가 변경된다면 쿼리의 최종 결과 값이 비일관성 (jnconsistency) 상태에 놓이게 될 수 있다.(그 트랜잭션이 어떤 이유에서건 롤백될
    수있기 때문이다.)

h3.(4) Non-Repeatable Read(= Inconsistent Analysis)

  • 한 트랜잭션 내에 서 같은 쿼리를 두 번 수행할 때 그 사이에 다른 트랜잭션이 값을 수정 또는 삭제함으로써
    두 쿼리의 결과가 상이하게 나타나는 비일관성 (jnconsistency)이 발생하는것을말한다.

h3.(5) Phantom Read

  • 한트랜잭션 안에서 일정범위의 레코드들을두번 이상읽을때 첫 번째 쿼리에서 없던 유령 (phantom) 레코드가 두 번째 쿼리에서 나타나는 현상을 말한다.
  • 고립화 수준을 높이면 해결(일관성 확보)되지만 동시성이 저하된다