TIL - 트랜잭션

Jaa-van·2023년 5월 10일
0
post-thumbnail

트랜잭션

작업의 완정성을 보장해주기 위해 사용되는 개념

-> 특정 작업을 전부 처리하거나, 전부 실패하게 만들어 ~데이터의 일관성~을 보장해주는 기능이다
( 대부분의 데이터베이스가 트랜잭션의 특징을 이용하고 있다 )

업데이트를 해야하는 기능이 두가지 이상 연속될 경우
한가지만 업데이트 되는 부분 업데이트( partial update) 와 같은 상황을 방지하기 위해서 트랜잭션이라는 개념을 도입하게 되었다.
ex) 작업 내역을 저장하는 로깅 작업, 영화관 예매 시스템, 은행 결제 시스템 등

트랜잭션의 특징 (ACID)

  1. ATOMICITY 원자성
    트랜잭션 내에서 실행되는 명령은 하나의 묶음으로 처리되어
    전부 성공하거나 모두 실패하게 된다
    ex) a의 계좌에서 금액을 차감한다, b의 계좌에 금액을 증가시킨다
    ( 하나의 함수처럼 처리한다 )

  2. CONSISTENCY 일관성
    트랜잭션 내부에서 처리되는 데이터의 일관성을 유지해야 한다
    -> 도중에 실패한 경우에 실패한 상태로 데이터가 방치되는 것이 아닌 처음의 데이터로 되돌아간다

  3. ISOLATION 격리성
    트랜잭션을 수행하는 중간 상태를 보거나 변경할 수 없도록 구성한다
    ( 이에 따라 동시성과 격리수준이라는 개념이 생겨나게 되었다 )

    • 동시성 -> 여러명의 클라이언트가 하나의 데이터를 동시에 사용 및 공유하는 것
      두개 이상의 트랜잭션이 동시에 하나의 데이터를 참조하게 되면 rollback 을 하게될 경우 동시성 문제가 발생하게 된다. => 하나의 클라이언트만 해당 자원을 점유할 수 있도록 하여 문제를 해결한다 ( 이를 자원 잠금 이라고 한다 )
  4. DURABILITY
    트랜잭션이 성공적으로 수행되면 수정된 데이터를 시스템에 영구적으로 적용하는 특징
    => 트랜잭션이 성공되어 COMMIT 을 요청했지만 변경사항이 적용되기 전에 DB 가 비정상 종료가 될 경우, DB 를 재시작하면 트랜잭션의 변경사항을 다시 반영하게 된다

Lock

동시성 제어를 위해 해당하는 데이터를 점유하여 다른 트랜잭션의 접근을 막아 동시성과 일관성의 균형을 맞추기 위해 사용한다

@Lock의 종류

  1. 공유 락( shared Locks ) , 읽기 락 ( READ Locks )
    데이터를 읽는 것은 허용하지만 수정하는 것을 금지한다
  2. 베타 락 ( exclusive locks ) , 쓰기 락 ( WRITE Locks )
    다른 트랜잭션이 데이터를 읽거나 수정하는 것을 전부 금지한다

@락킹 수준 ( Locking Level )

  1. 글로벌 락 (global locks), 데이터베이스 락 ( database locks )
    데이터 베이스의 모든 테이블에 락을 걸어 현재 트랜잭션을 제외한 나머지 트랜잭션들이 모든 테이블을 사용할 수 없게 만든다
  2. 테이블 락
    다른 사용자가 작업중인 테이블을 동시에 수정하지 못하도록 한다
  3. 네임드 락
    특정 문자열을 점유하여 수정하지 못하도록 한다
  4. 메타데이터 락
    다른 사용자가 작업중인 테이블의 동일한 행 및 동일한 데이터베이스의 객체를 동시에 수정하지 못하도록 한

=> 잘못된 락 설정을 사용하게 되면 교착 상태 ( Dead Lock ) 이 발생해 프로그램이 멈추게 된다

트랜잭션의 격리 수준

여러 트랜잭션이 동시에 처리될 때 다른 트랜잭션에서 데이터를 읽을 수 있도록 허용하거나 거부하는 것의 수준을 결정하는 것

  1. READ UNCOMMITTED
    커밋되지 않은 읽기를 허용하는 수준의 격리 수준
    -> 가장 낮은 격리 수준이며 동시성은 높지만 일관성이 쉽게 깨진다

  2. READ COMMITTED
    커밋된 읽기 만 허용하고 select 문들 실행할 때 바로 공유락을 건다
    -> 데이터를 수정하고 있는 중에는 읽을 수 없다

  3. REPETEABLE READ
    읽기를 마치더라도 공유락을 풀지 않고 트랜잭션이 완전히 종료될 때 공유락을 푼다
    -> 공유 락이 걸린 상태에서 데이터를 수정할 수는 없지만, 데이터를 삽입하는 것이 가능해 팬텀 읽기 라는 문제가 발생할 수 있다

  4. SERIALIZABLE
    데이터를 읽는 동안 다른 트랜잭션이 해당 데이터를 읽거나 삽입할 수 없고, 데이터를 추가하는 것도 불가능하다
    -> 가장 높은 수준의 격리 수준으로 동시성이 떨어진

0개의 댓글