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




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



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

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

오라클은 완벽한 문장수준의 읽기 일관성을 보장하나 트랜잭션에 대해서는 기본적으로 보장하지 않는다.







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


 트랜잭션 수준으로 읽기 일관성을 강화 하려면 트랜잭션 고립화 수준을 높여 주어야 한다.

트랜잭션 고립화 수준을 조절하는 방법은 네가지 수준이 있다.

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 현상 발생

 \- DB2, SQL Server, Sybase의 경우 읽기 공유 Lock을 이용해서 구현, 하나의 레코드를 읽을 때 Lock을 설정하고 해당 레코드에서 빠지는 순간 Lock해제

 \- Oracle은 Lock을 사용하지 않고 쿼리시작 시점의 Undo 데이터를 제공하는 방식으로 구현


■ 레벨 2 ( = Repeatable Read )

 \- 선행 트랜잭션이 읽은 데이터는 트랜잭션이 종료될 때까지 후행 트랜잭션이 갱신하거나 삭제하는 것을 불허함으로써 같은 데이터를 두번 쿼리했을 때 일관성 있는 결과를 리턴

 \- Phantom Read 현상 발생

 \- DB2, SQL Server의 경우 트랜잭션 고립화 수준을 Repeatable Read로 변경하면 읽은 데이터에 걸린 공유 Lock을 커밋할 때까지 유지하는 방식으로 구현

 - Oracle은 이 레벨을 명시적으로 지원하지 않지만 for update절을 이용해 구현 가능,

   SQL Server등에서도 for update 절을 사용할 수 있지만 커서를 명시적으로 선언할 때만 사용 가능함


■ 레벨 3 ( = Serializable Read )

 \- 선행 트랜잭션이 읽은 데이터를 후행 트랜잭션이 갱신하거나 삭제하지 못할 뿐만 아니라 중간에 새로운 레코드를 삽입하는 것도 막아줌

 \- 완벽한 읽기 일관성 모드를 제공

 




 트랜잭션 고립화 수준 조정기능을 위한 script


set tracsaction isolation level serializable;





낮은 단계의 트랜잭션 고립화 수준을 이용시 발생하는 현상 3가지

  • Dirty Read ( = Uncommitted Dependency )
  • Non-Repeatable Read ( = Inconsistent Analysis )
  • Phantom Read





(3) Dirty Read ( = Uncommitted Dependency)


커밋되지 않은 수정 중인 데이터를 다른 트랜잭션에서 읽을 수 있도록 허용할때 발생

대부분 DBMS가 기본 트랜잭션 고립화 수준을 레벨1 로 설정하고 있어 Dirty Read는 발생하지 않음

 =  커밋된 데이터만 읽을 수 있도록 허용

SQL Server, Sybase등은 데이터를 읽을 때 공유 Lock을 사용,

갱신중인 레코드에는 배타적 Lock이 걸림, 이는 공유 Lock과는 호환되지 않아 갱신중인 레코드는 읽지 못함(Lock에 의한 동시성 저하 발생)

오라클은 다중 버전 읽기 일관성 모델을 채택함으로써 Lock을 사용하지 않고도 Dirty Read를 피해 일관성 있는 데이터 읽기가 가능




 

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


 한 트랜잭션 내에서 같은 쿼리를 두번 수행 할 때 그 사이에 다른 트랜잭션이 값을 수정 또는 삭제함으로써

두 쿼리의 결과가 상이하게 나타나는 비일관성이 발생하는 것을 말함





(5) Phantom Read


한 트랜잭션 안에서 일정 범위의 레코드를 두번 이상 읽을 때, 첫번째 쿼리에서 없던 레코드가 두번째 쿼리에서 나타나는 현상

이는 트랜잭션 도중 새로운 레코드가 삽입되는 것을 허용하기 때문에 나타나는 현상임.

{*}Phantom Read현상을 방지하려면 트랜잭션 고립화 수준을 레벨3으로 올려 주어야 한다.*


고립화 수준을 높이면 데이터 일관성은 확보 되지만 동시성이 현격히 저하되는 결과를 초래함

오라클은 해당 쿼리의 SCN 확인 과정을 통해 질의 시점에 존재했던 데이터만을 대상으로 집계 수행을 하므로 동시성을 저하시키지 않으면서 일관성을 유지



트랜잭션 고립화 수준을 높이면 일관성은 향상 되지만 더 넓은 범위의 Lock을 더 오랫동안 유지하는 방식으로 동시성을 저하한다.(그림2-2참조)

그러나 오라클은 트랜잭션 고립화 수준을 높이더라도 Lock을 사용하지 않으므로 동시성이 저하되지는 않는다.



 

참조



 

위 사용된 Image는 마소7월호에서 발췌하였습니다.