ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • DB - Transaction
    CS/DB 2021. 2. 14. 22:42

    Transaction


    트랜젝션이란

    • 데이터베이스에서 하나의 논리적 기능을 수행하기 위한 일련의 연산 집합으로서 작업의 단위이다.

    • 다음과 같은 4가지 원칙을 만족한다.
      1. 원자성(Automicity): 트랜젝션의 연산은 DB에 모두 반영되던가, 전혀 반영되지 않아야 한다.
      2. 일관성(Consistency): 트랜젝션 작업이 종료된 후에도 일관성 있는 DB상태를 유지해야 한다.
      3. 독립성(Isolation): 한 트랜젝션이 작업하는 동안 작업중인 데이터를 다른 트랜젝션들이 접근하지 못하도록 해야 한다.
      4. 영속성(Durability): 트랜젝션의 실행이 성공적으로 완료된 후 결과는 영구적으로 반영되어야 한다.

     

    격리수준(Isolation level)

    • 동시에 여러 트랜젝션이 처리될 때 일관성 없는 데이터를 허용하는 수준을 말한다.
    • 격리수준은 크게 아래의 4가지로 나뉘며 아래로 내려갈수록 고립 정도가 높아지고 성능이 떨어진다.
      1. Read Uncommitted
        • 트랜젝션의 변경 내용이 commit이나 rollback에 상관없이 다른 트랜젝션에서 보여진다.
        • Dirty Read 현상이 발생할 수 있다.
          • a트랜젝션에서 10번 사원의 나이를 27 -> 28로 변경 후 아직 커밋하지 않음
          • b트랜젝션에서 10번 사원의 나이를 조회하면 28로 조회됨(Dirty Read)
          • a트랜젝션이 rollback한다
          • b트랜젝션은 10번사원이 여전히 28살이라고 생각하고 로직을 수행한다.
      2. Read Committed
        • 트랜젝션의 변경 내용이 commit 되어야만 다른 트랜젝션에서 조회할 수 있다. 
        • Non-Repeatable Read 부정합 현상이 발생할 수 있다.
          • b트랜젝션에서 10번 사원의 나이를 조회한다 -> 27
          • a트랜젝션에서 10번 사원의 나이를 27 -> 28살로 변경하고 커밋한다.
          • b트랜젝션이 다시 10번 사원의 나이를 조회한다 -> 28 (Non-Repeatable Read. 하나의 트랜젝션이 같은 값을 조회할 때 다른 값이 검색된다.)
      3. Repeatable Read
        • 트랜젝션이 시작되기 전에 커밋된 내용에 대해서만 조회할 수 있다. 즉 트랜젝션이 시작되고 종료되기 전까지 한 번 조회한 값은 계속 같은 값이 조회된다. 

        • 자신의 트랜젝션 보다 먼저 실행된 트랜젝션에서 변경된 것만 보게 된다.

        • Mysql DBMS에서 기본으로 사용하고 있다.

        • update한 데이터에 대해서는 정합성을 보장하지만, insert/delete는 보장되지 않는다.

        • Phantom Read문제가 발생한다.

          • a트랜젝션을 시작하고 10번 사원의 나이를 조회한다 -> 27

          • b트랜젝션을 시작하고 10번 사원의 나이를 27 -> 28로 변경하고 커밋한다.

          • a트랜젝션이 10번 사원의 나이를 조회한다 -> 27 (b트랜젝션이 자신보다 늦게 시작하였으므로 변경된 것을 읽지 않는다.)

          • b트랜젝션이 11번 사원의 정보를 삽입한다.

          • a트랜젝션이 사원의 정보를 조회한다 -> 10, 11번 데이터가 조회된다. (insert에 대해서는 정합성이 보장되지 않는다. Phantom Read - 있던 데이터가 사라지거나 없던 데이터가 생기는 현상이다.)

        • Phantom Read문제가 발생한다.
          • 바로 위 예제에서 마지막에 a트랜젝션이 11번 데이터까지 조회하고 있다.
      4. Serializable
        • 가장 높은 격리수준으로 트랜젝션이 특정 테이블을 읽으면 다른 트랜젝션은 그 테이블의 데이터를 추가, 변경, 삭제할 수 없는 수준이다.
        • 동시 처리 성능이 가장 떨어지나 위에서 언급되었던 정합성 문제가 전혀 발생하지 않는다. 

     

    Lock

    • 트랜젝션 처리의 순차성을 보장하기 위한 방법이다. 
    • 종류로는 공유 lock와 베타 lock가 있다.
      1. 공유(Shared) Lock
        • 데이터를 읽을 때 사용되는 Lock이며 공유 Lock끼리는 동시에 접근 가능하다.
        • 즉 하나의 데이터를 읽는 것은 여러 사용자가 동시에 할 수 있다. 
        • 하지만 공유 Lock이 설정된 데이터에 베타 Lock를 사용할 수 없다.
      2. 베타(Exclusive) Lock
        • 데이터를 변경할 때 사용되는 Lock이며 트랜젝션이 완료될 때까지 유지된다.
        • 베타Lock이 해제될 때까지 다른 트랜젝션은(읽기 포함) 해당 리소스에 접근할 수 없다.
        • 하나의 데이터 항목에 대해 하나의 배타 Lock만 가능하다.

     

    데드락(교착상태)

    • 여러개의 트랜젝션 들이 실행을 하지 못하고 서로 무한정 기다리는 상태를 의미한다.

    • 트랜젝션 처리의 순차성을 보장하기 위한 Locking은 교착상태를 일으킬 수 있다. 
    • 두 트랜젝션이 각각 Lock를 설정한 다음 서로의 Lock에 접근하여 값을 얻어오려고 할 때 이미 Lock처리가 되어 양쪽 트랜젝션 모두 영원히 처리가 되지 않는 상태를 말한다.
    • 교착상태가 발생하면 DBMS가 둘 중 한 트랜젝션에 에러를 발생시킴으로써 문제를 해결한다.
    • 교착상태의 빈도를 낮추는 방법
      • 트랜젝션을 자주 커밋한다.
      • 테이블 접근 순서를 동일하게 한다.

     

    reference

    velog.io/@hygoogi/%EA%B8%B0%EC%88%A0-%EB%A9%B4%EC%A0%91-%EC%A7%88%EB%AC%B8-%EB%AA%A8%EC%9D%8C

    sabarada.tistory.com/121

    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/

    private-space.tistory.com/97

    blog.naver.com/PostView.nhn?blogId=ndb796&logNo=221243161017&parentCategoryNo=&categoryNo=1&viewDate=&isShowPopularPosts=false&from=postView

     

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

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

    댓글

Designed by Tistory.