SQL
DB Isolation

답변을 받아 답변내용을 뒤에 추가하였습니다. 

 

트랜잭션의  4가지 특성중 하나인 격리성(Isolation)은  

동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 독립적으로 실행 혹은 격리해야하는 특성을 가지고 있습니다.

 

이러한 특징을 가진 격리성은 대해서 이슈가 있는데  

격리성을 완벽히 보장하기 위해 모든 트랜잭션을 순차적으로 실행한다면 동시성 처리 이슈가 발생하게 되고,

반대로 동시성을 높이기 위해 여러 트랜잭션을 병렬방식으로 처리하게 되면 데이터의 무결성이 깨질 수 있습니다.

 

격리성,동시성에 관련 이슈로는 3개가 있습니다.

  1. Dirty Read

  2. Non-repeatable Read

  3. Phantom Read

 

Dirty Read 

하나의 트랜잭션(TX1)이 데이터에 접근하여 어떠한 값을 변경하고 커밋을 하지 않았을 때, 다른 

트랜잭션(TX2)이 해당 데이터를 Read하게 되면 TX2가 읽은 데이터는 이미 변경된값이 될  것입니다. 하지만 TX1이

최종 커밋을 하지않고 종료한다면, TX2가 읽은 데이터는 올바른 데이터가 아니게 되는 문제점입니다.

 

Non-Repeatable Read 

하나의 트랜잭션(TX1)이 데이터를 Read하고 있을때, 다른 트랜잭션(TX2)가 데이터에 접근하여 어떠한 값을 

변경 혹은 삭제하고 커밋을 하고, 그 후 TX1이 다시 해당 데이터를 Read하고자 하면 변경된 데이터 혹은

삭제된 데이터를 찾게되는 문제점입니다.

 

Phantom Read

하나의 트랜잭션(TX1) 중에 특정 조건으로 데이터를 검색하여 결과를 얻고, 이때 다른 트랜잭션(TX2)가 접근하여

해당 조건의 데이터 일부를 삭제/추가 하였을때, 아직 끝나지 않은 TX1이 다시 한번 해당 조건으로 데이터를

검색하면 TX2에서 삭제/추가된 데이터가 함께 조회/누락 되어서 혼란을 주는 문제점 입니다.

 

다음과 같은 문제점으로 트랜잭션 격리수준이라는 것이 있는데 이것은 총 4개의 단계로 나누어져있습니다.

단계에 따라 위에 나오는 격리성 관련 이슈를 해결할 수 있습니다.

 

Isolation Level

Dirty Read

Non-repeatable Read

Phantom Read

Read Uncommitted 0단계

O

O

O

Read Committed 1단계

X

O

O

Repeatable Read 2단계

X

X

O

Serializable Read 3단계

X

X

X

단계가 올라갈수록 위의 3개의 이슈는 적게 발생하는 장점이있으면서 동시 처리 성능을 떨어지는 단점이 있습니다.

 

 

SELECT CASE transaction_isolation_level

WHEN 0 THEN 'Unspecified'

WHEN 1 THEN 'ReadUncommitted'

WHEN 2 THEN 'ReadCommitted'

WHEN 3 THEN 'Repeatable'

WHEN 4 THEN 'Serializable'

WHEN 5 THEN 'Snapshot' END AS TRANSACTION_ISOLATION_LEVEL

FROM sys.dm_exec_sessions

where session_id = @@SPID

 

위의 쿼리를 돌려서 확인해보았을때 

제가 사용하는 Mssql에서는 ReadCommitted가 default로 설정되어있어 Dirty Read이슈는 차단이 가능합니다.

Read Committed는 데이터가 Committed(변경 작업 완료) 된 경우에만 조회를 할 수 있도록 하고 그렇지 않으면 Committed되기

전까지 접속에 Lock을 걸어서 기다리게 만듭니다. 즉, 공유잠금인 Shared Lock이 걸리는 레벨입니다.

하지만 때로는 데이터의 일관성과 관계없이 기다리지 않고 빨리 데이터를 읽어오기를 원하는 경우가 있는데 이때 사용되는

옵션이 NOLOCK입니다.

사용법은

SELECT * FROM TABLE WITH(NOLOCK) 

입니다.

댓글 0