CS/DB

DB - Transaction

빈둥벤둥 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