트랜잭션의 이해와 Lock 해결 방법

과녁스·2021년 12월 20일
0

DB

목록 보기
3/5
post-thumbnail

트랜잭션(Transaction)


정의

  • 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위
  • 한번에 모두 수행되어야 할 일련의 연산들을 의미

이해

  1. 트랜잭션은 데이터베이스 시스템에서 병행 제어 및 회복 작업 시 처리되는 작업의 논리적 단위이다.
  2. 사용자가 시스템에 대한 서비스 요구 시 시스템이 응답하기 위한 상태 변환 과정의 작업단위이다.
  3. 하나의 트랜잭션은 Commit되거나 Rollback된다.

특징

  • 원자성 (Atomicity)
    • 트랜잭션이 데이터베이스에 모두 반영 또는 전혀 반영되지 않아야 함
    • 트랜잭션 내의 모든 명령은 반드시 완벽히 수행되어야 하며, 모두가 완벽히 수행되지 않고 어느하나라도 오류가 발생하면 트랜잭션 전부가 취소되어야 함
  • 일관성 (Consistency)
    • 트랜잭션이 그 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 변환
    • 시스템이 가지고 있는 고정요소는 트랜잭션 수행 전과 트랜잭션 수행 완료 후의 상태가 같아야 함
  • 독립성 (Isolation)
    • 둘 이상의 트랜잭션이 실행될 경우, 다른 트랜잭션에 영향을 줄 수 없음
    • 수행중인 트랜잭션은 완전히 완료될 때까지 다른 트랜잭션에서 수행 결과를 참조
  • 지속성 (Durability)
    • 트랜잭션이 성공적으로 끝났을 경우, 결과가 영구적으로 반영됨

Commit / Rollback

Commit

  • 하나의 트랜잭션이 성공적으로 끝났고, 데이터베이스가 일관성있는 상태에 있을 때, 하나의 트랜잭션이 끝났다라는 것을 트랜잭션 관리자에게 알려주기 위하여 사용하는 연산
  • 연산을 사용하면 수행했던 트랜잭션이 로그에 저장

Rollback

  • 하나의 트랜잭션 처리가 비정상적으로 종료되어 트랜잭션의 원자성이 깨진경우, 트랜잭션을 처음부터 다시 시작하거나, 트랜잭션의 부분적으로만 연산된 결과를 다시 취소

  • 활동(Active) : 트랜잭션이 실행중인 상태
  • 실패(Failed) : 트랜잭션 실행에 오류가 발생하여 중단된 상태
  • 철회(Aborted) : 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태
  • 부분 완료(Partially Committed) : 트랜잭션의 마지막 연산까지 실행했지만, Commit 연산이 실행되기 직전의 상태
  • 완료(Committed) : 트랜잭션이 성공적으로 종료되어 Commit 연산을 실행한 후의 상태

Lock 해결방법

Lock

  • Lock이란 트랜잭션 처리의 순차성을 보장하기 위한 방법
  • DBMS마다 Lock을 구현하는 방식과 세부적인 방법이 다름
  • DBMS를 효과적으로 이용하기 위해서는 해당 DB의 Lock에 대한 이해가 필요

Lock 종류

  • Lock의 종류로는 공유(Shared) Lock과 베타(Exclusive) Lock이 있음
  • 공유락은 다른 말로 Read Lock이라고 불리며 베타락은 Write Lock이라고도 불림

공유(Shared) Lock

  • 공유 Lock은 데이터를 읽을 때 사용되어지는 Lock
  • 공유 Lock은 공유 Lock 끼리는 동시에 접근이 가능
  • 하나의 데이터를 읽는 것은 여러 사용자가 동시에 할 수 있다라는 의미
  • 공유 Lock이 설정된 데이터에 베타 Lock을 사용할 수는 없음

베타(Exclusive) Lock

  • 베타 Lock은 데이터를 변경하고자 할 때 사용되며, 트랜잭션이 완료될 때까지 유지
  • 베타락은 Lock이 해제될 때까지 다른 트랜잭션(읽기 포함)은 해당 리소스에 접근할 수 없음
  • 베타 Lock은 다른 트랜잭션이 수행되고 있는 데이터에 대해서는 접근하여 함께 Lock을 설정할 수 없음

Lock 설정 범위

  • 데이터베이스
    • 데이터베이스 범위의 lock은 전체 데이터베이스를 기준으로 lock
    • 1개의 세션만이 DB의 데이터에 접근이 가능
    • 일반적으로는 사용하지 않음. DB의 소프트웨어 버전을 올린다던지 주요한 DB의 업데이트에 사용
  • 파일
    • 데이터베이스 파일을 기준으로 lock을 설정
    • 테이블, row 등과 같은 실제 데이터가 쓰여지는 물리적인 저장소
    • 파일 범위의 Lock은 잘 사용되지는 않음
  • 테이블
    • 테이블 수준의 Lock은 테이블을 기준으로 Lock을 설정
    • 테이블의 모든 행을 업데이트 하는 전체 테이블에 영향을 주는 변경을 수행할 때 유용
    • DDL(create, alter, drop 등) 구문과 함께 사용되며 DDL Lock이라고도 불림.
  • 페이지와 블럭
    • 파일의 일부인 페이지와 블록을 기준으로 Lock을 설정
    • 잘 사용되지는 않음
  • 컬럼
    • 컬럼 기준의 Lock은 컬럼을 기준으로 Lock을 설정할 수 있음
    • 해당 형식은 Lock 설정 및 해제의 리소스가 많이 들기 때문에 일반적으로 사용되지는 않음
    • 지원하는 DBMS도 많지 않음
  • 행(Row)
    • 행 수준의 Lock은 1개의 행(Row)를 기준으로 Lock 설정
    • DML에 대한 Lock으로 가장 일반적으로 사용하는 Lock

블로킹(Blocking)

  • 블로킹은 Lock간(베타 - 베타, 베타 - 공유)의 경합이 발생하여 특정 Transaction이 작업을 진행하지 못하고 멈춰선 상태
  • 공유락 끼리는 블로킹이 발생하지 않지만 베타락은 블로킹을 발생
  • 블로킹을 해소하기 위해서는 이전의 트랜잭션이 완료(커밋 OR 롤백)가 필요
  • 나중에 들어온 트랜잭션은 이전 트랜잭션이 마무리되어야 이후 진행이 가능
  • 경합은 성능에 좋지 않은 영향을 미치기 때문에, 경합을 최소화 할 필요가 있음

  1. 한 트랜잭션의 길이를 너무 길게하는 것은 경합의 확률이 높아짐
  2. 설계 시 같은 데이터를 갱신하는 트랜잭션이 동시에 수행되지 않도록 해야함
  3. 트랜잭션 격리성 수준을 불필요하게 상향 조정하지 않음
  4. 쿼리를 오랜시간 잡아두지 않도록 적절한 튜닝을 진행 필요

교착상태(Deadlock)

  • 교착상태는 두 트랜잭션이 각각 Lock을 설정하고 다음 서로의 Lock에 접근하여 값을 얻어오려고 할 때
  • 각각의 트랜잭션에 의해 Lock이 설정되어 있기 때문에 양쪽 트랜잭션 모두 영원히 처리가 되지않게 되는 상태

  1. 교착상태가 발생하면 DBMS가 둘 중 한 트랜잭션에 에러를 발생시킴으로써 문제를 해결
  2. 교착상태가 발생할 가능성을 줄이기 위해서는 접근 순서를 동일하게 하는것이 중요

출처

profile
ㅎㅅㅎ

0개의 댓글