DB 트랜잭션

트랜잭션이란?

트랜잭션은 하나의 작업을 수행하기 위해 필요한 데이터베이스의 연산들을 모아놓은 것으로, 데이터베이서에서 논리적인 작업의 단위이며 장애가 발생했을 때 데이터를 복구하는 작업의 단위이다.

현업에서 쓰이는 개념으로 쉽게 설명하면 트랜잭션 단위로 데이터의 커밋과 롤백이 이루어진다.

  • 커밋(Commit) : 모든 부분작업이 정상적으로 완료되면 이 변경사항을 한꺼번에 DB에 반영한다.
  • 롤백(Rollback) : 부분 작업이 실패하면 트랜잭션 실행 전으로 되돌린다.
    이때, 모든 연산을 취소하지 않고 정해진 부분까지만 되돌리고 싶을 때 사용하는 것이 savepoint이다.

트랜잭션의 특징(ACID)

트랜잭션이 성공적으로 처리되어 데이터베이스의 무결성과 일관성을 보장하기 위해 4가지 특징을 만족해야한다. 4가지 특징은 다음과 같다.

  1. 원자성(Atomicity)
  2. 일관성(Consistency)
  3. 격리성(Isolation)
  4. 지속성(Durability)

각각의 특징에 대하여 자세하게 알아보자

  1. 원자성 (Atomicity)

    • 트랜잭션을 구성하는 연산들은 모두 정상적으로 실행되거나 하나도 실행되지 않아야 한다는 all or nothing 방식이다.
    • 트랜잭션의 연산은 데이터베이스에 모두 반영되든지 아니면 전혀 반영되지 않아야한다.
    • 트랜잭션 내의 모든 명령은 반드시 완벽하게 수행되어야 하며, 모두가 완벽히 수행되지 않고 어느 하나라도 오류가 발생한다면 트랜잭션 전부가 취소되어야 한다.
  2. 일관성 (Consistency)

    • 트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지하는 것을 의미한다.
    • 예를 들어 무결성 제약이 모든 계좌는 잔고가 있어야 한다면 이를 위반하는 트랜잭션은 중단된다.
  3. 독립성 (Isolation)

    • 트랜잭션 수행시 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장하는 것을 의미한다.
    • 수행중인 트랜잭션은 완전히 완료될 때까지 다른 트랜잭션에서 수행 결과를 참조할 수 없다.
    • 예를 들어 은행 관리자는 이체 작업을 하는 도중 쿼리를 실행하더라도 특정 계좌간 이체하는 양 쪽을 볼 수없다.
    • 성능 관련 이유로 인해 이 특성은 가장 유연성이 있는 제약조건이다.
  4. 지속성 (Durability)

    • 성공적으로 수행된 트랜잭션은 영구적으로 반영되어야 함을 의미한다.

트랜잭션 연산

보통 DB를 사용 할 때, 쿼리를 날리는 시점에 데이터베이스에 반영된다고 생각한다. 하지만 데이터베이스에 반영되는 시점은 트랜잭션 연산이 성공적으로 완료되는 시점에 실제 데이터베이스에 반영이 된다. 트랜잭션 연산에는 크게 두가지 과정이 있다.

  1. commit 연산

    • 트랜잭션이 성공적으로 수행되었음을 선언(작업 완료)
    • commit 연산이 실행 된 후에야 트랜잭션의 수행결과가 데이터베이스에 반영되어 일관된 상태를 지속적으로 유지.
    • commit 연산의 실행을 통해 트랜잭션의 수행이 성공적으로 완료되었음을 선언하고 결과를 최종 데이터베이스에 반영.
  2. rollback 연산

    • 트랜잭션이 수행을 실패했음을 선언(작업 취소)
    • rollback 연산이 실행되면 트랜잭션이 지금까지 실행한 연산의 결과가 취소되고 트랜잭션이 수행되기 전의 상태로 돌아간다.
    • 트랜잭션 수행 도중 일부 연산이 처리되지 못한 상황에서는 rollback 연산을 실행하여 트랜잭션의 수행이 실패했음을 선언하고, 모순되지 않도록 데이터베이스를 트랜잭션 수행 전의 일관된 상태로 되돌려야한다.

트랜잭션 상태

트랜잭션은 위와 같은 연산을 수행할 떄 크게 5가지의 상태가 존재하고 상태 처리 과정은 아래 그림과 같다

트랜잭션 상태

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

Author

SeoYoonho

Posted on

2022-03-26

Updated on

2022-03-27

Licensed under

Comments