ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [DB]Transaction
    CS/DB 2021. 7. 11. 20:25

    📝 Transaction


    ✨ 해당 글은 아래 [10분 테코톡]을 듣고 작성했습니다.✨

     


     

    📌 Transaction

     

    🔎 트랜잭션에 대해 알아보자.

     

    - 여러 쿼리를 논리적으로 하나의 작업으로 묶어주는 것이다. 

     

    - 관련 용어를 알아보자.

    • commit: 트랜잭션으로 묶인 모든 쿼리가 성공하여 트랜잭션 연산 결과를 DB에 반영한다.
    • rollback: 쿼리 실행 결과를 취소하고 DB의 상태를 트랜잭션 이전 상태로 되돌린다.

     

     

     

    📌 Transaction의 성질

     

    🔎 트랜잭션의 성질을 알아보자.

     

    - 트랜잭션이 안전하게 수행된다는 것을 보장한다. 다음과 같은 성질을 가진다. (ACID 성질)

    • Atomicitiy(원자성): 트랜잭션은 DB에 모두 반영되거나, 전혀 반영되지 않아야 한다.
    • Consistency(일관성): 트랜잭션 작업처리결과는 항상 일관성 있어야 한다. DB는 항상 일관된 상태로 유지되어야 한다.
    • Isolation(독립성):  둘 이상의 트랜잭션이 동시에 실행되고 있을 때, 어떤 트랜잭션도 다른 트랜잭션 연산에 끼어들 수 없다. 
    • Durability(지속성): 트랜잭션이 성공적으로 완료되었으면 결과는 영구적으로 반영되어야 한다.

     

     

    🔎 ACID 성질은 항상 지켜져야 할까?

     

    - ACID는 이론적은 보장해야할 성질이다. 실제로는 성능을 위해 성질 보장이 완화되기도 한다.

     

     

     

    📌 Transaction 격리 수준

     

    🔎 격리 수준에 대해 알아보자.

     

    🙋‍♀️ 여러 트랜잭션이 동시에 DB에 접근할 때 그 접근을 제어하기 위해 격리 수준을 설정할 수 있다.

    - 다음과 같은 단계로 나눌 수 있으며 아래로 갈수록 동시성은 떨어지지만, 데이터 정합성은 높아진다.

    • READ-UNCOMMITTED
    • READ-COMMITTED
    • REPEATABLE-READ
    • SERIALIZABLE

     

     

    🔎 READ-UNCOMMITTED

     

    -  커밋되기 이전의 트랜잭션의 데이터 변경 내용을 다른 트랜젝션에서 읽는 것을 허용한다.

    • 트랜잭션 A가 10번 사원의 나이를 27살에서 28살로 변경후 아직 commit하지 않았다.
    • 동시에 실행되고 있는 트랜젝션 B에서 10번사원의 나이를 조회하면 28살로 조회된다. (dirty read)
    • 트랜잭션 A가 rollback 한다.
    • 트랜잭션 B는 10번 사원이 여전히 28살이라고 생각하고 로직을 수행한다. 

     

    - Dirty read, Non repeatable read, Phantom read 가 발생한다.

     

     

    🔎 READ-COMMITTED

     

    - 커밋이 완료된 트랜잭션의 변경사항만 다른 트랜잭션에서 조회가 가능하다.

    • 트랜잭션 B가 10번 사원의 나이를 조회하면 27살로 조회된다.
    • 트랜잭션 A가 10번 사원의 나이를 27살에서 28살로 변경후 commit한다.
    • 트랜잭션 B가 다시 10번사원의 나이를 조회하면 28살로 조회된다. (non repeatable read)

     

    - Non repeatable read, Phantom read 가 발생한다.

     

     

    🔎 REPEATABLE-READ

     

    🙋‍♀️ MYSQL) 트랜잭션 마다 ID를 부여하여 트랜잭션 ID보다 작은 트랜잭션에서 변경한 내용만 조회한다.

     

    - 트랜잭션이 시작되고 종료되기 전까지 한 번 조회한 값은 계속 같은 값이 조회된다. 

    • 트랜잭션 A를 시작하고 10번 사원의 나이를 조회하면 27살로 조회된다.
    • 트랜잭션 B를 시작하고 10번 사원의 나이를 27살에서 28살로 변경한다.
    • 트랜잭션 A가 10번 사원의 나이를 조회하면 27살로 조회된다. (트랜잭션 B의 ID가 더 작다.)
    • 트랜잭션 B가 11번 사원의 정보를 insert한다. 
    • 트랜잭션 A가 모든 사원의 정보를 조회하면 10, 11번 사원이 조회된다. (phantom read)

     

    - Phantom read 가 발생한다.

     

     

    🔎 SERIALIZABLE

     

    - 가장 높은 격리수준으로 트랜잭션에서 사용하는 데이터를 다른 트랜잭션에서 접근할 수 없다.

    - 동시 처리 성능이 가장 떨어지지만 정합성 문제가 전혀 발생하지 않는다.

     

     

     

    🔎 격리성 관련하여 발생할 수 있는 정합성 문제에 대해 알아보자.

     

    - Dirty read

    • commit되지 않은 변경사항을 읽는다.

     

    - Non repeatable read

    •  같은 트랜잭션 내에서 같은 값을 조회할 때 다른 값이 조회된다.

     

    - Phantom read

    • 없던 데이터가 생기거나, 있던 데이터가 사라지는 것을 말한다.
    • update에 대해서는 정합성을 보장하지만, insert/delete에 대해선 보장하지 않기 때문에 발생한다.

     

     

    📌 Transaction 전파 타입

     

     

    🔎 트랜잭션 전파타입이란 무엇일까

     

    - 트랜잭션을 시작하거나 기존 트랜잭션에 참여하는 방법을 결정하는 속성이다.

     

     

    🔎 트랜잭션 전파 타입 in 스프링

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

    DB - RDBMS  (0) 2021.03.01
    DB - Transaction  (0) 2021.02.14
    DB - Index  (0) 2021.02.14
    DB - KEY  (0) 2021.02.12
    DB - 파티셔닝과 샤딩  (0) 2021.02.12

    댓글

Designed by Tistory.