트랜잭션 수준 읽기 일관성
- 문장수준 읽기 일관성(Statement-Level Read Consistency) : 쿼리가 시작된 시점을 기준으로 테이터를 일관성 있게 읽어들이는 것을 말함
- 트랜잭션 수준 읽기 일관성(Transaction-Level Read Consistency) : 트랜잭션이 시작된 시점을 기준으로 일관성 있게 데이터를 읽어 들이는 것을 말함.
- 오라클은 완벽한 문장수준의 읽기 일관성은 보장하나 트랜잭션에 대해서는 기본적으로 보장하지 않는다.
트랜잭션 고립화 수준
- DBMS마다 구현방식이 달라 본서에서 자세히 다루는 것은 적절치 않다고 생각한다.(저자님 생각..)
- ANSI/ISO SQL standard(SQL192)
레벨 0(= Read Uncommitted)
- 트랜잭션에서 처리 중인/ 아직 커밋되지 않은 테이터를 다른 트랜잭션이 읽는 것을 허용.
- Dirty Read, Non-Repeatable Read, Phantom Read 현상 발생
- 오라클은 이 레벨을 지원하지않음
레벨 1(=Read Committed)
- Dirty Read 방지 : 트랜잭션이 커밋되어 확정된 테이터만 읽는 것을 허용
- 대부분의 DBMS가 기본모드로 채택하고 있는 일관성 모드
- 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절을 사용할 수 있찌만 커서를 명시적으로 선언할때만 사용 가능함
h5 레벨 3(=Serializable Read) - 선행 트랜잭션이 읽은 데이터를 후행 트랜잭션이 갱신하거 삭제하지 못할 뿐만 아니라 중간에 새로운 레코드를 삽입하는 것도 막아줌
- 완벽한 읽기 일관성 모드를 제공
트랜잭션 레벨 읽기 일관성을 설정하려면.?
set transaction isolation level serializable;
낮은 단계의 트랜잭션 고립화 수준을 사용할 때 발생하는 에러 3가지..
1) Dirty Read(=Uncommitted Dependency)
- 아직 커밋되지 않은 수정 중인 테이타를 다른 트랜잭션에서 읽을 수 있도록 허용할 때 발생한다.(해당 트랜잭션이 롤백하는 경우..)
- 오라클은 다중 버전 읽기 일관성 모델을 채택함으로써 Lock을 사용하지 않고도 Dirty Read를 피해 일관성 있는 데이터 읽기가 가능하고, 따라서 레벨 0수준으로 트랜잭션 고립화 수준으로 트랜잭션 고립화 수준을 낮추는 방법을 제공하지 않음.
2) Non-Repeatable Read(= Inconsistent Analysis)
- 한 트랜잭션 내에서 같은 쿼리를 두 번 수행할 때, 그 사이에 다른 트랜잭션이 값을 수정 또는 삭제함으로써 두쿼리의 결과가 상이하게 나타는 비 일관성이 발생하는 것을 말한다.
3) Phantom Read
- 한 트랜잭션 안에서 일정 범위의 레코드를 두번 이상 읽을 때, 첫번째 쿼리에서 없던 레코드가 두번재 쿼리에서 나타난현상.(이는 새로운 레코드가 삽입되는 것을 허용하기 때문에 나타나는 현상임)
- Phantom Read현상을 방지하려면 트랜잭션 고립화 수준을 레벨3으로 올려 주어야 한다.
참고 할수 있는 사이트
http://121.254.172.39:8080/pls/apex/f?p=101:11:0::::P11_QUESTION_ID:3606900346836911