Covenant

Isolation Level 의 종류는 4가지가 있다. 


1. Read Uncommitted

SELECT 문장을 수행하는 경우 해당 데이터에 Shared Lock이 걸리지 않는 Level입니다. 따라서, 어떤 사용자가 A라는 데이터를 B라는 데이터로 변경하는 동안 다른 사용자는 B라는 아직 완료되지 않은(Uncommitted 혹은 Dirty) 데이터 B를 읽을 수 있습니다.

2. Read Committed

SQL Server가 Default로 사용하는 Isolation Level입니다. 이 Level에선 SELECT 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸립니다. 그러므로, 어떠한 사용자가 A라는 데이터를 B라는 데이터로 변경하는 동안 다른 사용자는 해당 데이터에 접근할 수 없습니다.

3. Repeatable Read

트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이 걸리므로 다른 사용자는 그 영역에 해당되는 데이터에 대한 수정이 불가능합니다. 가령, Select col1 from A where col1 between 1 and 10을 수행하였고 이 범위에 해당하는 데이터가 2건이 있는 경우(col1=1과 5) 다른 사용자가 col1이 1이나 5인 Row에 대한 UPDATE이 불가능합니다. 하지만, col1이 1과 5를 제외한 나머지 이 범위에 해당하는 Row를 INSERT하는 것이 가능합니다.

4. Serializable

트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이 걸리므로 다른 사용자는 그 영역에 해당되는 데이터에 대한 수정 및 입력이 불가능합니다. 예를 들어, Repeatable Read의 경우 1에서 10 사이에 해당되는 데이터에 대한 UPADTE이 가능하였습니다. 하지만 이 Level에서는 UPDATE 작업도 허용하지 않습니다.
                                                                 출처 : http://support.microsoft.com/kb/601430/ko



위 네가지 Isolation Level  에 따라 나타나는 현상이 세가지가 있다.

1. 더티 읽기(Drity read)

 어떤 트랜잭션이 커밋되기 전에 다른 트랜잭션에서 데이터를 읽는 현상이다. 예를 들면, 사용자 A가 값을 변경하고 아직 커밋하지 않아도 사용자 B가 변경한 후의 값을 읽는 것을 가리킨다. 사용자 A가 빈 싱글룸 수가 10인 레코드를 9로 변경한 경우 커밋 전이라 하더라도 사용자가 B가 SELECT한 결과는 9가 된다. 확정 전의 더럽혀진 데이터를 읽는 것에서 붙여진 이름이다.


2. 에매한 읽기(Fuzzy / NonRepeatable Read) 

 어떤 트랜잭션이 이전에 읽어 들인 데이터를 다시 읽어 들일 떄 2회 이후의 결과가 1회 떄와 다른 현상이다. 예를 들면 최초에 사용자 A가 빈 싱글룸 수 10을 읽고 그 후 사용자 B가 값을 9로 변경해 커밋했다고 하자. 계속해서 사용자 A가 SELECT를 다시 실행하면 최초에 SELECT했던 10이 아닌 변경 후의 9를 읽어 들이게 된다. 사용자 A가 최초에 읽은 값 10이 2회 이후의 SELECT에서 보증되지 못하고 에매하게(Fuzzy) 되는 것에서 붙여진 이름이다. 


3. 팬텀 읽기(Phantom Read) 


 어떤 트랜잭션을 읽을 떄 선택할 수 있는 데이터가 나타나거나 사라지는 현상이다. 최초에 사용자 A가 범위 검색(예를 들어 빈 싱글룸 수가 10 이상의 호텔)을 수행한 후 3행을 읽었다고 가정하자. 계속해서 사용자 B가 막 그 범위에 들어가는 데이터 1행을 INSERT하고 커밋도 실행했다. 계속해서 사용자 A가 다시 같은 SELECT 문을 실행하면 최초에 SELECT해서 얻었던 3행이 아닌 4행이 선택된다. 이처럼 나타나거나 사라지는(DELECT나 UPDATE로 사라진다. 유령과 닮아서 붙여진 이름이다.




본 게시글은 일부 '데이터베이스 첫 걸음' 참고해서 작성하였습니다.

'Computer Science > Database' 카테고리의 다른 글

데이터베이스 트랜젝션 ACID란?  (8) 2018.06.17