[데이터베이스] 트랜잭션 격리 수준(Transaction Isolation Level)

James·2023년 7월 4일
0
post-thumbnail

Isolation Level 이란?


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

Isolation Level 의 필요성

데이터베이스는 ACID 같이 트랜잭션이 원자적이면서도 독립적인 수행을 하도록 한다.
그래서 Locking 이라는 개념이 등장한다.

Locking이란?
트랜잭션이 DB를 다루는 동안 다른 트랜잭션이 관여하지 못하게 막는 것

  • 하지만, 무조건적인 Locking으로 동시에 수행되는 많은 트랜잭션들을 순서대로 처리하는 방식으로 구현되면 DB의 성능은 떨어지게 된다.
  • 반대로 응답성을 높이기 위해 Locking 범위를 줄인다면 잘못된 값이 처리 될 여지가 있다.

그래서!! 최대한 효율적인 Locking 방법이 필요하다.

Isolation Level 의 종류


Read Uncommitted (레벨 0)

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

Shared Lock 이란?
: Shared Lock은 트랜잭션이 데이터를 읽을 때 해당 데이터에 걸리는 잠금(Lock)입니다.

  • 이런 잠금은 데이터의 무결성을 보장하고 동시에 여러 트랜잭션 사이에서 일관성을 유지하는 데 도움을 줍니다.

[특징]

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

[문제점 및 단점]

  • Dirty Read, Non-Repeatable Read, Phantom Read와 같은 문제가 발생할 수 있습니다.
  • 데이터베이스의 일관성과 격리성 유지할 수 없습니다.
  • 정합성에 문제가 많은 격리 수준이기 때문에 사용하지 않는 것을 권장한다.

Read Committed (레벨 1)

SELECT 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리는 Level

위의 그림과 같이 Commit이 되지 않는 상태지만 Update된 값을 다른 트랜잭션에서 읽을 수 있다.
하지만, 실제 테이블 값을 가져오는 것이 아니라 Undo 영역에 백업된 레코드에서 값을 가져온다.

Undo 란?
: 데이터베이스의 변경사항을 롤백하거나 실행 취소하는데 사용되는 정보를 생성하고 관리합니다. 이러한 정보는 주로 커밋(Commit)되기 전의 트랜잭션 작업에 대한 기록으로 구성됩니다.

[특징]

  • 각 쿼리가 Commit이 이루어진 트랜잭션만 조회할 수 있다.
    • 때문에 Commit이전의 데이터는 참조 되지 않는다.
  • 트랜잭션이 수행되는 동안 다른 트랜잭션이 접근할 수 없어 대기하게 된다.

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

  • SQL Server가 Default로 사용하는 Isolation Level

[문제점 및 단점]

  • Dirty Read는 발생하지 않지만, Non-Repeatable ReadPhantom Read는 여전히 발생할 수 있습니다.

Repeatable Read (레벨 2)

트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이 걸리는 Level

[특징]

  • 트랜잭션이 범위 내에서 조회한 데이터의 내용이 항상 동일함을 보장한다.

    (같은 트랜잭션 내에서 반복해서 조회해도 결과가 변하지 않습니다. 다른 트랜잭션이 데이터를 수정하거나 추가할 경우, 해당 트랜잭션이 완료될 때까지 해당 데이터에 대한 조회 결과는 동일하게 유지됩니다.)

따라서, 다른 사용자는 그 영역에 해당되는 데이터에 대한 수정이 불가능하다.

[문제점 및 단점]

  • Non-Repeatable Read는 방지되지만, Phantom Read는 여전히 발생할 수 있습니다.

Serializable (레벨 3)

트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이 걸리는 Level

  • 완벽한 읽기 일관성(완전 격리) 모드를 제공한다.
    따라서, 트랜잭션 동안에는 다른 트랜잭션에서 해당되는 데이터에 대한 수정 및 입력이 불가능하며, 모든 작업은 순차적으로 처리됩니다.

결론

  • Isolation level 조정은 동시성이 증가되는데 반해 데이터 무결성에 문제가 발생할 수 있고, 데이터의 무결성을 유지하는 데 반해 동시성이 떨어질 수 있다.
  • 레벨이 높아질수록 비용이 높아진다.

낮은 단계의 Isolation Level 이용시 발생하는 현상


1. Dirty Read

: Commit 되지 않은 수정 중인 데이터를 다른 트랜잭션에서 읽을 수 있도록 허용할 때 발생하는 현상
어떤 트랜잭션에서 아직 실행이 끝난지 않은 다른 트랜잭션에 의한 변경 사항을 보게 되는 되는 경우

[Dirty Read 문제점]
Dirty Read는 Read Uncommitted 격리 수준에서 발생할 수 있으며, 데이터의 불일치 문제를 일으킬 수 있습니다.

2. Non-Repeatable Read

: 수정,삭제시 비일관성

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

[Non-Repeatable Read 문제점]
Non-Repeatable Read는 Read Committed 격리 수준에서 발생할 수 있으며, 데이터 일관성에 대한 문제를 야기할 수 있습니다.

3. Phantom Read

: 삽입시 데이터 무결성 발생

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

[Phantom Read 문제점]
Phantom Read는 Repeatable Read 또는 Serializable 격리 수준에서 발생할 수 있으며, 데이터의 무결성을 해치는 문제를 발생시킬 수 있습니다.

결론

격리 수준을 설정함으로써 데이터 일관성동시성 제어 사이에서 적절한 균형을 유지할 수 있습니다.


Reference & Additional Resources

profile
의미있는 성장의 태도, 긍정적인 사고를 지닌 Deveolper

0개의 댓글