Isolation level (정리)

2018. 7. 19. 13:51 Spring Framework/Spring boot

Isolation level 

트랜잭션에서 일관성이 없는 데이터를 허용하도록 하는 수준

Ø  ANSI에서 작성된 SQL-92 표준은 4가지 Transaction Isolation Level 정의

ü  Read Uncommitted

ü  Read Committed

ü  Repeatable Read

ü  Serializable

Ø  Isolation level 조정은 동시성이 증가되는데 반해 데이터 무결성에 문제가 발생할 수 있고데이터의 무결성을 유지하는 데 반해 동시성이 떨어질 수 있다.

Ø  레벨이 높아질수록 비용이 높아짐.


A.    Read Uncommited Isolation Level (레벨 0)

- SELECT 문장을 수행하는 경우 해당 데이터에 shared lock이 걸리지 않는 레벨.

트랜잭션에 처리중인 혹은 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용

오라클은 이 레벨 지원 안함

어떤 사용자가 A라는 데이터를 B라는 데이터로 변경하는 동안 다른 사용자는 B라는 아직 완료되지 않은(Uncommitted 혹은 Dirty) 데이터 B를 읽을 수 있다.

- Dirty read, Non-repeatable read, Phantom read 현상 발생


B.     Read Committed Isolation Level (레벨 1)

- SELECT 문장이 수행되는 동안 해당 데이터에 shared lock이 걸리는 레벨.

- dirty read 방지 : 트랜잭션이 커밋되어 확정된 데이터만을 읽는 것을 허용

어떠한 사용자가 A라는 데이터를 B라는 데이터로 변경하는 동안 다른 사용자는 해당 데이터에 접근할 수 없다.

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

Non-repeatable read, Phantom read 현상 발생


C.     Repeatable Read Isolation Level (레벨 2)

트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 shared lock이 걸리므로 다른 사용자는 그 영역에 해당되는 데이터에 대한 수정이 불가능하다.

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

- DB2, SQL Server의 경우 읽은 데이터에 걸린 공유 lock을 커밋할 때까지 유지하는 방식으로 구현

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

- SELECT col FROM a WHERE col1 BETWEEN 1 AND 10 을 수행하였고 결과는 두 건의 데이터 출력(col1 = 1 ,5). 다른 사용자가 col1 1이나 5 row에 대한 update는 불가능하다이를 제외한 나머지 범위에 해당하는 row insert하는 것은 가능.

Phantom read 현상 발생


D.    Serializable Isolation Level (레벨 3)

- SELECT 수행 시 READ LOCK,  shared lock을 사용

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

데이터의 일관성 및 동시성을 위해 MVCC(Multi Version Concurrency Control)을 사용하지 않음(MVCC는 다중 사용자 데이터베이스 성능을 위한 기술로 데이터 조회 시 LOCK을 사용하지 않고 데이터의 버전을 관리해 데이터의 일관성 및 동시성을 높이는 기술)

트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 shared lock이 걸리므로 다른 사용자는 그 영역에 해당되는 데이터에 대한 수정 및 입력이 불가능하다.

 

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

- Dirty Read (=Uncommitted Dependency)

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

- Non-Repeatable Read (=Inconsistent Analysis)

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

- Phantom Read

한 트랜잭션 안에서 일정 범위의 레코드를 두 번 이상 읽을 때첫 번째 쿼리에서 없던 레코드가 두 번째 쿼리에서 나타나는 현상이는 트랜잭션 도중 새로운 레코드가 삽입되는 것을 허용하기 때문에 나타남


출처 : http://egloos.zum.com/ljlave/v/1530887