ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Database] Transaction과 Isolation Levels
    CS/Database 2022. 1. 19. 10:48

    Transaction이란 ❔❔

    트랜잭션(Transaction)은 데이터베이스의 상태를 변환하는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미한다. 하나의 트랜잭션은 Commit되거나 Rollback된다.

    트랜잭션의 특성

    트랜잭션은 다음의 ACID라는 4가지 특성을 만족해야 한다.

    원자성(Atomicity)

    트랜잭션의 작업들이 모두 수행되거나 전혀 수행되지 않아야 한다. 트랜잭션이 부분적으로 수행된다면 데이터베이스에 반영되지 않아야 한다.

    일관성(Consistency)

    트랜잭션이 완료된 다음의 상태에서도 트랜잭션이 일어나기 전의 상황과 동일하게 데이터의 일관성을 보장해야 한다.

    고립성(Isolation)

    각각의 트랜잭션은 서로 간섭없이 독립적으로 수행되어야 한다. 둘 이상의 트랜잭션이 동시에 병행 실행되는 경우 어느 하나의 트랜잭션 실행 중에 다른 트랜잭션의 연산이 끼어들 수 없다. 수행 중인 트랜잭션은 완전히 완료될 때까지 다른 트랜잭션에서 수행 결과를 참조할 수 없다.

    지속성(Durability)

    트랜잭션이 정상적으로 종료된 다음에는 영구적으로 데이터베이스에 작업의 결과가 저장되어야 한다. 소프트웨어나 하드웨어가 고장나더라도 완료된 트랜잭션은 영구적으로 반영이 되어야 한다. 그러므로 recovery system이 필수적이다. 보통 database log를 통해 복구한다.

    트랜잭션의 상태

    출처: https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/Database#transaction

    Active

    트랜잭션의 활동 상태. 트랜잭션이 실행중이며 동작중인 상태를 말한다.

    Failed

    트랜잭션 실패 상태. 트랜잭션이 더이상 정상적으로 진행 할 수 없는 상태를 말한다.

    Partially Committed

    트랜잭션의 Commit 명령이 도착한 상태. 트랜잭션의 commit 이전 sql문이 수행되고 commit만 남은 상태를 말한다.

    Committed

    트랜잭션 완료 상태. 트랜잭션이 정상적으로 완료된 상태를 말한다.

    Aborted

    트랜잭션이 취소 상태. 트랜잭션이 취소되고 트랜잭션 실행 이전 데이터로 돌아간 상태를 말한다.

    Partially Committed와 Committed의 차이점

    Commit 요청이 들어오면 Partial Commited 상태가 된다. 이후 Commit을 문제없이 수행할 수 있으면 Committed 상태로 전이되고, 만약 오류가 발생하면 Failed 상태가 된다.

    즉, Partial Commited Commit 요청이 들어왔을때를 말하며, Commited Commit을 정상적으로 완료한 상태를 말한다.

    트랜잭션 동시 실행(Concurrent Execution)

    하나의 시스템에서 여러 개의 트랜잭션이 동시에 실행될 수 있다. 동시 실행을 하게 되면 프로세서와 디스크 utilization이 높아져 트랜잭션 throuput(단위 시간 당 트랜잭션 처리 수)이 증가하고 average response time(응답이 오는 데까지 걸리는 시간)을 줄일 수 있다.

    따라서 데이터베이스는 Consistency(일관성)를 보장하면서 Concurrency(동시성)을 지원해야 한다.

    👉 Consistnecy와 Concurrency 간의 tradeoff가 존재함

    → Consistency를 보장하기 위해서는 Concurrency가 떨어지고, Concurrency를 보장하면 Consistency가 떨어진다.

     

    Transaction Isolation Levels(트랜잭션 격리 수준)

    위에서 말한 것과 같이 데이터베이스는 Consistency를 보장하면서 Concurrency를 지원해야 한다. 하지만 Consistency와 Concurrency 사이에는 tradeoff가 존재한다. 이는 트랜잭션 간의 Isolation(고립성)을 어떻게 지원하느냐에 따라 달라진다.

    Transaction Isolation Levels이란 동시에 여러 트랜잭션이 실행될 때, 트랜잭션끼리 얼마나 서로 고립되어 있는지를 나타내는 수준이다. 데이터베이스는 Isolation의 정도에 따라 4가지의 level을 지원한다.

    • Read Uncommitted
    • Read Committed
    • Reapeatable Read
    • Serializable

     

    출처:  https://hleee.medium.com/%EA%B2%A9%EB%A6%AC-%EC%88%98%EC%A4%80-3287d4bcc64d

    아래로 내려갈수록 Isolation과 Consistency는 높아지고 Concurrency과 Throuput은 떨어진다.

     

    위의 3가지 지표의 개념을 짚고 넘어간다.

    • Dirty read: 추가/수정/삭제 중에 커밋 되지 않은 데이터 조회를 허용함으로써, 트랜잭션이 종료되면 더 이상 존재하지 않거나, 롤백되었거나, 저장 위치가 바뀌었을 수도 있는 데이터를 읽어들이는 경우를 말한다.
    • Non-repeatable read: 하나의 트랜잭션이 같은 값을 조회할 때 값이 다른 경우를 말한다.
    • Phantom read: 있던 데이터가 사라지거나 없던 데이터가 생기는 경우 말한다.

    Read Uncommitted

    커밋되지 않은 데이터에 접근 가능한 수준으로, 네 가지 Isolation level 중 트랜잭션의 Isolation을 가장 덜 지원하는 가장 느슨한 형태이다. Read uncommittedDirty read를 유발한다. 하지만 Lock을 유지하는 데에 드는 비용이 제일 적고, Deadlock에 빠질 위험이 적어 성능은 뛰어나다.

     

    따라서 Read uncommitted는

    • Consistency를 위해 되도록이면 사용하지 않는 것이 이상적이며,
    • 사용하더라도 수정되지 않을 데이터를 조회하거나 몇몇 행이 제대로 조회되지 않아도 무관할 만큼 거대한 양의 데이터를 집계하는 데에만 사용하는 것이 바람직하다.

    출처: https://private-space.tistory.com/97

    Read Committed

    Read Uncommitted보다는 높은 격리 수준으로, 커밋이 완료된 데이터에 대해서만 조회를 허용하기 때문에 Dirty read를 방지할 수 있다. 하지만 하나의 트랜잭션이 같은 값을 조회할 때 값이 달라질 수 있는 Non-repeatable read가 발생할 수 있다.

     

    따라서 Read committed는

    • Dirty read를 방지할 수 있다는 점에서는 Read uncommitted의 한계를 보완하지만,
    • Lock이 발생하는만큼 속도나 성능에 있어서는 좀 더 느려질 수 있으며 Deadlock도 발생할 수 있다.
    • 또한 트랜잭션 간 Isolation을 완전히 보장하지 못해 non-repeatable read, phantom read가 발생할 수 있다.
    • 일반 애플리케이션에는 큰 문제가 없을 수 있어도 뱅킹 서비스처럼 데이터의 Integrity(무결성)가 중요하다면 적합하지 않다.

    출처: https://private-space.tistory.com/97

    Repeatable Read

    트랜잭션이 시작되고 종료되기 전까지 한 번 조회한 값은 계속 같은 값이 조회되는 수준으로, 트랜잭션 시작 전에 커밋된 데이터에 한해서만 조회되기 때문에 Non-repeatable read를 방지할 수 있다. Repeatable read는 데이터 수정에는 Consistency를 보장하지만, 추가/삭제에는 Consistency가 보장되지 않기 때문에 Phantom read가 발생할 수 있다.

    따라서 Repeatable read는

    • non-repeatable read를 방지할 수 있다는 점에서는 Read committed의 단점을 보완하지만,
    • Lock이 적용되는 범위가 넓어져 성능과 속도가 느려지고,
    • 데이터 추가/삭제에서의 Isolation을 보장하지 못해 Phantom read가 발생할 수 있다.

    출처: https://private-space.tistory.com/97

    Serializable

    Serializable은 한 트랜잭션을 다른 트랜잭션으로부터 완전히 분리하여 가장 높은 수준의 Isolation을 보장하지만 Concurrency와 Throuput은 가장 떨어진다. 작업 중인 트랜잭션이 완전히 종료될 때까지 다른 어떤 작업도 허용하지 않아 Dirty read, Non-repeatable read, Phantom read를 완벽히 방지한다.


    Reference

    https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/Database#transaction

    https://coding-factory.tistory.com/226

    https://pjh3749.tistory.com/225

    https://private-space.tistory.com/97

    https://bubble-dev.tistory.com/entry/DB-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98?category=1156684 

    https://dar0m.tistory.com/225

    https://joont92.github.io/db/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-%EA%B2%A9%EB%A6%AC-%EC%88%98%EC%A4%80-isolation-level/

    https://hleee.medium.com/%EA%B2%A9%EB%A6%AC-%EC%88%98%EC%A4%80-3287d4bcc64d

    'CS > Database' 카테고리의 다른 글

    [Database] Database Scan  (0) 2022.01.19
    [Database] Clustered Index와 Non-clustered Index  (0) 2022.01.17
    [Database] Index  (0) 2022.01.14
    SQL 테스트 준비  (0) 2022.01.02

    댓글

Designed by Tistory.