트랜잭션 격리 수준

양시준·2022년 3월 31일
0

TIL

목록 보기
18/21

자료조사 중에 이 움짤을 봤는데 격리 수준 차이에 따른 진행을 잘 보여주어서 가져왔다.

트랜잭션 격리 수준이란?

트랜잭션 격리 수준(Transaction Isolation Level)이란 동시에 여러 트랜잭션이 처리 될 때, 트랜잭션끼리 얼마나 고립되어 있는가를 나타내는 정도다.

레벨(고립도)이 높아질수록 고립도가 올라가서 더 확실한 처리가 가능해지지만 동시에 수행될 수 있는 트랜잭션을 순서대로 처리하게 되어 속도가 느려지게 된다.

트랜잭션 격리 수준

ANSI/ISO SQL 표준(SQL92)에서 정의한 4가지 트랜잭션 격리성 수준을 기준으로 설명한다.

Read Uncommitted

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

SELECT 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리지 않는다.

Read Committed

트랜잭션이 커밋되어 확정된 데이터만 다른 트랜잭션이 읽도록 허용한다.

Dirty Read를 방지해주지만 Non-Repeatable Read와 Phantom Read 현상은 막지 못한다.

그러므로 읽는 시점에 따라 결과가 다를 수 있다.

SELECT 문장이 수행되는 동안 해당 데이터에만 Shared Lock이 걸린다.

MVCC를 사용하여 구현한다.

MVCC란?

Repeatable Read

트랜잭션 내에서 쿼리를 두 번 이상 수행할 때, 첫 번째 쿼리에 있던 레코드가 사라지거나 값이 바뀌는 현상을 방지해 준다.

다만 Phantom Read 현상을 막지는 못해서, 첫 번째 쿼리에서 없던 새로운 레코드가 나타날 수 있다.

트랜잭션이 완료될 때까지 SELECT 문장이 사용되는 모든 데이터에 Shared Lock이 걸린다.

다른 사용자는 트랜잭션 영역에 해당하는 데이터에 대한 수정이 불가능하다.

Serializable Read

트랜잭션 내에서 쿼리를 두 번 이상 수행할 때, 첫 번째 쿼리에 있던 레코드가 사라지거나 값이 바뀌지 않음은 물론 새로운 레코드가 나타나지도 않는다.

트랜잭션이 완료될 때까지 SELECT 문장이 사용되는 모든 데이터에 Shared Lock이 걸린다.

다른 사용자는 트랜잭션 영역에 해당하는 데이터에 대한 수정 및 입력이 불가능하다.

낮은 단계의 트랜잭션 격리 수준을 사용할 때 발생하는 현상

Dirty Read

다른 트랜잭션에 의해 수정됐지만 아직 커밋되지 않은 데이터를 읽는 것을 말한다.

커밋되지 않은 값을 읽었지만, 변경을 가한 트랜잭션이 롤백된다면 비일관성을 가지게 된다.

Non-Repeatable Read

한 트랜잭션 내에서 같은 쿼리를 두 번 수행했을때, 두 쿼리의 결과가 상이하게 나타나는 비일관성 현상이다.

한 트랜잭션이 수행 중 일때 다른 트랜잭션이 값을 수정 또는 삭제하면 발생한다.

Phantom Read

한 트랜잭션 내에서 같은 쿼리를 두 번 수행했는데, 첫 번째 쿼리에서 없던 유령(Phantom) 레코드가 두 번째 쿼리에서 나타나는 현상을 말한다.

한 트랜잭션이 수행 중일 때 다른 트랜잭션이 새로운 레코드를 추가 함으로써 나타난다.

트랜잭션 격리성 수준과 비일관성 현상 표

Isolation LevelDirty ReadNon-Repeatable ReadPhantom Read
Read Uncommitted
Read Committed
Repeatable Read
Serializable Read

참고

profile
야크 털 깎기와 러버덕 디버깅을 좋아하는 개발자

0개의 댓글