JuBin's personal study blog

[DataBase] 트랜잭션 격리수준(Isolation Level) 본문

DataBase

[DataBase] 트랜잭션 격리수준(Isolation Level)

JuBin 2023. 5. 21. 22:42
반응형
Isolation(고립성, 격리성)은 데이터베이스 트랜잭션에서 중요한 속성 중 하나로, 동시에 발생하는 여러 트랜잭션이 서로 간섭하지 않도록 보장하는 원칙입니다. 이것은 동시에 수행되는 여러 트랜잭션에도 불구하고 각 트랜잭션을 마치 독립적으로, 나아가 순차적으로 실행되는 것처럼 보이게 만듭니다. 고립성의 단계는 DBMS에서 설정할 수 있으며, 일반적으로 다음 네가지로 분류됩니다.
사용하는 DB마다 제공하는 Isolation Level는 다 다릅니다.

용어 정리

표준

Dirty Read : 아직 커밋되지 않은 변경 사항을 확인할 수 있습니다.(두 트랜잭션 중 하나의 트랜잭션이 롤백을 하던 안하던 발생)

Non-repeatable read : 하나의 트랜잭션에서 read를 두번 수행하였는데 첫번째는 10이라는값을 읽었지만, 두번째 read를 수행할때는 20이라는 다른값을 읽는다라는 의미 입니다.

Phantom read : 하나의 트랜잭션에서 a = 10인 튜플을 찾았을때 return되는 row가 1개였는데, 두번째 a = 10인 튜플을 찾을때 첫번째 튜플을 찾았을때 찾은 1개의 데이터가 아닐때 생기는 이상현상을 얘기합니다.(없던 데이터가 생김)

 

추가적

Dirty Write : 커밋되지 않은 데이터를 write하는 현상을 얘기합니다.

Lost update : 두 트랜잭션이 동시에 a라는 컬럼을 업데이트할때 하나의 트랜잭션에서 업데이트한 내용이 반영이 안되는 현상을 얘기합니다.(덮어씀)

Read skew : 데이터가 불일치(inconsistent)한 데이터를 읽는 현상. non-repeatable 현상과 비슷합니다.

Write skew : 제약조건과 불일치한 데이터를 write했을때 발생하는 현상.

 

 

 

표준

Read Uncommitted (읽기 미확정)

이 수준에서는 트랜잭션이 다른 트랜잭션에서 아직 커밋되지 않은 변경 사항을 확인할 수 있습니다. 이를 Dirty Read라고 합니다.

Read Uncommitted 레벨에서는 Dirty read, Non-repeatable read, Phantom read를 허용합니다. 가장 허용해주는 부분이 많은 동시에, 동시성은 높아져서 처리량은 높지만 이상현상은 자주 발생할수 있습니다.

 

Read Committed (읽기 확정)

이 수준에서는 트랜잭션이 오직 커밋된 변경 사항만 확인할 수 있습니다. 다른 트랜잭션에서 커밋되지 않은 변경 사항을 확인하는

Drity Read는 발생하지 않습니다.

Read Committed 레벨에서는 Dirty Read는 허용하지 않고, Non-repeatable read, Phantom read는 허용합니다.

 

Repeatable Read (반복 가능한 읽기)

이 수준에서는 트랜잭션에서 특정 데이터를 여러 번 읽을 때마다 같은 데이터를 확인할 수 있습니다. 즉, 한 트랜잭션 동안에 다른 트랜잭션에서 해당 데이터를 변경하는 것이 허용되지 않습니다.

Reapeatable Read 레벨에서는 Phantom read만 허용합니다.

 

Serializable (직렬 가능)

이는 가장 엄격한 고립 수준으로, 모든 트랜잭션이 순차적으로 실행되는 것처럼 보입니다. 즉, 한 번에 하나의 트랜잭션만이 시스템에서 실행됩니다. 이는 동시성이 크게 제한되는 대신 데이터 일관성이 가장 잘 보장됩니다.

Serializable 레벨에서는  Dirty read, Non-repeatable read, Phantom read를 모두 허용하지 않고 추가적으로 3가지 이상현상 외에도 아예 이상한 현상 자체가 발생하지 않는 레벨을 의미합니다.

Isolation에 대한 이상현상을 일어나지 않지만 성능과 처리량은 좋지 않습니다.

 

추가적

Snapshot(MVCC(multi version concurrency control)의 한 종류)

각각 트랜잭션이 시작하는 시점에 커밋된 데이터를 snapshot을 찍어 저장해놓고 변경사항이 생길때 찍어놓은 snapshot을 업데이트해 놓습니다. 트랜잭션 커밋 직전에 같은 컬럼에 대해 업데이트 할때 snapshot과 실제 데이터를 비교한뒤 다르면 abort(rollback)처리 합니다.

즉, 처음으로 커밋한 트랜잭션이 winner입니다.(먼저 커밋한 트랜잭션만 변경사항이 반영됨)

 

 

정리

정리하면 격리 수준을 높이면 동시성은 줄어들지만 데이터 일관성은 향상되지만 반대로 격리 수준을 낮추면 동시성은 증가하지만 데이터의 일관성 문제가 발생할 있습니다. 따라서 요구 사항에 따라 적절한 트랜잭션 격리 수준을 선택해야 합니다.

DB설계자 및 개발자는 데이터베이스의 전체 처리량과 데이터의 일관성사이에 타협이 필요합니다. 또한 데이터베이스마다 제공하는 Isolation Level이 다 다르고 같은 이름의 Isolation Level이라도 동작방식이 다를수 있습니다. 또한 이상현상에 대한 기준이 다 다르기 떄문에 매뉴얼을 자세하게 읽어봐야 합니다.

반응형