ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [DataBase] 트랜젝션
    CS/DataBase 2024. 12. 2. 00:07

    트랜잭션 ? 

    DB의 상태를 변경시키는 작업의 단위

     

    트랜잭션의 연산

    COMMIT 연산

    트랜잭션이 성공적으로 수행되었음을 선언하는 연산

    ROLLBACK 연산

    트랜잭션 수행이 실패했음을 선언하고 작업을 취소하는 연산

     

    ACID

    Atomicity (원자성)

    트랜잭션이 DB에 모두 반영되거나, 혹은 전혀 반영되지 않아야 된다 (All or Nothing).

    Consistenty (일관성)

    트랜잭션의 작업 처리 결과는 항상 일관성 있어야 한다.

    시스템이 가지고 있는 고정 요소는 트랜잭션 수행 전과 수행 후의 상태가 같아야 한다는 말로,

    DB의 제약조건을 위배하는 작업을 트랜잭션 과정에서 수행할 수 없음을 나타낸다.

    Isolation (독립성)

    둘 이상의 트랜잭션이 동시에 병행 실행되고 있을 때, 어떤 트랜잭션도 다른 트랜잭션 연산에 끼어들 수 없다.

    Durability (지속성)

    트랜잭션이 성공적으로 완료되었으면, 결과는 영구적으로 반영되어야 한다.

     

    트랜잭션의 상태

    Active

    트랜잭션 활동 상태

    Partially Committed

    트랜잭션의 마지막 연산까지 실행하고 COMMIT 연산을 실행하기 직전의 상태

    Failed

    트랜잭션 실패 상태

    Committed

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

    Aborted

    트랜잭션 수행을 실패하고 ROLLBACK 연산을 실행한 상태

     

    트랜젝션 격리 수준

    트랜잭션 격리 수준은, 동시에 여러 트랜잭션이 처리될 때 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있도록 허용할지 말지를 결정하는 것입니다.

     

    READ UNCOMMITTED (커밋되지 않은 읽기)

    • 각 트랜잭션에서의 변경 내용이 COMMIT이나 ROLLBACK 여부에 상관 없이 다른 트랜잭션에서 값을 읽을 수 있다.
    • 정합성에 문제가 많은 격리 수준이기 때문에 사용하지 않는 것을 권장.
    • Dirty Read 발생
    💡 DIRTY READ
    트랜잭션이 작업이 완료되지 않았는데도 다른 트랜잭션에서 볼 수 있게 되는 현상
    ex)
    트랜잭션 A 가 실행되고 update 됐을 때 그 사이에 트랜잭션 B가 실행된다.
    그러면 트랜잭션 A에서 커밋이 되지 않았음에도 불구하고, 트랜잭션 B에서 트랜잭션 A가 update한 내용을 확인할 수 있게 된다.

     

    READ COMMITTED (커밋된 읽기)

    • COMMIT 이 된 데이터만 읽습니다.
    • RDB에서 대부분 기본적으로 사용되고 있는 격리 수준
    • Dirty Read와 같은 현상은 발생하지 않지만 NON-REPEATABLE READ 발생
    💡NON-REPEATABLE
    READ하나의 트랜잭션 내에서 동일한 SELECT 쿼리를 실행했을 때 항상 같은 결과를 보장해야 한다는 REPEATABLE READ 정합성에 어긋나는 것
    ex)
    트랜잭션 A에서 update 된 내용이 타 트랜잭션에서 바로 보여지지는 않는다.
    근데 트랜잭션 A에서 커밋이 완료되었는데 트랜잭션 B에는 아직 완료되지 않은 경우, 트랜잭션 B에서 다시 한번 조회를 하게 된다면 update 된 상태가 조회가 된다같은 조회(셀렉트)문인데도 결과가 다르기 때문에 정합성에 어긋난다.
    실제 테이블 값을 가져오는 것이 아니라 Undo 영역에 백업된 레코드에서 값을 가져온다.

     

    2 : REPEATABLE READ (반복 가능한 읽기)

    • 자신의 트랜잭션이 생성되기 이전의 트랜잭션에서 COMMIT 이 된 데이터만 읽습니다.
    • MySQL과 MariaDB 가 기본으로 사용하는 격리 수준
    • MySQL에서는 트랜잭션마다 트랜잭션 ID를 부여하여 트랜잭션 ID보다 작은 트랜잭션 번호에서 변경한 것만 읽게 된다.
    💡 PHANTOM READ
    다른 트랜잭션에서 수행한 변경 작업에 의해 레코드가 보였다가 안 보였다가 하는 현상
    ex) 같은 테이블에 접근하는 여러개의 트랜잭션을 처리하고 있습니다.
    그중 한 트랜잭션이 SELETE ~~ FOR UPDATE 을 사용하여 쓰기 잠금을 걸고 싶다고 가정합니다.
    쿼리문에 따라, SELECT하려는 레코드에 쓰기 잠금을 걸어야 하는데, Undo 레코드에는 잠금을 걸 수 없습니다.
    따라서 위와 같은 쿼리는 Undo 영역의 변경 전 데이터를 가져오는 것이 아니라 현재 레코드의 값을 가져오게 됩니다.
    따라서 레코드가 보였다 안보였다 한다고 해서 🎭 PHANTOM 이라고 합니다.

     

    3 : SERIALIZABLE (직렬화 가능)

    • 가장 단순한 격리 수준이지만 가장 엄격한 격리 수준
    • 데이터를 접근할 때, 항상 Lock을 걸고 데이터를 조회
    • SERIALIZABLE에서는 PHANTOM READ가 발생하지 않는다.
    • 성능 문제로 데이터베이스에서 거의 사용되지 않는다.

     

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

    트랜잭션 격리 수준  (0) 2025.02.23
    SQL의 윈도우 함수 (with PARTITION BY)  (2) 2025.02.17
    CTE(Common Table Expression)  (2) 2025.02.17
    [DataBase] 정규화, 반정규화  (3) 2024.11.25
    [Database] Index에 대해서  (1) 2024.11.18
Designed by Tistory.