[DB] Database transaction

cabbage·2023년 2월 13일
0

Database

목록 보기
1/6
post-thumbnail

Database transaction

Database transaction이 필요한 시나리오

  • 데이터베이스는 초당 수백만개의 동시 요청들을 처리한다.
  • 이 경우 데이터베이스의 동일 항목에 대한 동시 요청인 경우가 많다.
  • 온라인에서 한정판 게임을 오픈런하는 경우 상점에 접속한 모든 사람들이 동시에 장바구니에 같은 게임을 넣고 결제할 수도 있다.
  • 이런 경우에도 재고 수량은 반드시 정확하게 계산되어야 한다.
  • 이런 시나리오에서 데이터베이스 트랜잭션(Database transaction)이 사용된다.

Database transaction이란?

  • 데이터베이스 트랜잭션은 데이터베이스가 수행하는 일련의 작업들 (여러 작업들을 하나로 묶은 단위)
  • 데이터베이스 트랜잭션(일련의 작업들)은 실행되면 한 덩어리로 모두 실행된다. (단일 논리 단위)
  • 데이터베이스 트랜잭션 예시
  • A 계정에서 B 계정으로 5000원을 송금하는 경우
    1. A 계정에서 B 계정으로 5000원을 송금한다는 레코드를 생성한다. (일반적으로 이것을 데이터베이스 트랜잭션의 시작이라고 함)
    2. A 계정의 잔액을 확인한다.
    3. A 계정의 잔액에서 5000원을 뺀다.
    4. B 계정의 잔액을 확인한다.
    5. B 계정에 5000원을 추가한다.
  • 만약 데이터베이스가 이 트랜잭션을 하나의 전체 단위로 실행한다면, 트랜잭션 중간에 시스템 장애가 발생했을 때 트랜잭션을 취소하고 데이터베이스를 원래 상태로 다시 되돌릴 수 있다.
  • 일반적으로 롤백(rollback)은 트랜잭션에 의한 변경사항을 취소하는 프로세스를 말한다.
  • 또한 커밋(commit)은 트랜잭션에 의한 영구 변경을 말한다.

Database transaction이 필요한 이유

  1. 시스템 장애는 불가피하게 발생하고 트랜잭션은 결과의 신뢰성과 일관성을 보장한다. 이 점은 데이터베이스의 상태가 시스템 장애 시점 이전에 커밋된 모든 트랜잭션의 변경사항을 반영하고, 장애 지점부터 실행된 트랜잭션의 변경사항은 롤백한다는 것을 의미한다.

  2. 여러 요청이 데이터베이스 서버로 동시에 들어와 동일한 데이터를 동시에 변경하는 경우 충돌을 피하기 위해 요청을 격리해야 한다. 트랜잭션은 이런 요청들을 격리한다.

  • 이미지출처
  • 데이터베이스 트랜잭션이 실행 중인 경우, 데이터베이스의 상태는 일시적으로 일관적이지 않은 상태가 되지만, 트랜잭션이 커밋되거나 종료되면 변경사항들이 적용된다.
  • 트랜잭션의 라이프사이클 동안 트랜잭션은 여러 상태가 된다.
  • 이 상태들을 트랜잭션 상태(transaction states)라고 하며, 아래와 같은 종류가 있다.

Transaction states

  1. Active states (활성 상태)
    • 트랜잭션 실행의 첫 번째 상태이다.
    • 명령(읽기 또는 쓰기 연산)들이 실행되는 동안 하나의 트랜잭션은 활성 상태에 있다.
  2. Partially committed (부분 커밋)
    • 이 상태에서 변경사항이 적용되지만, 데이터베이스는 디스크에 변경사항을 커밋하지는 않는다.
    • 이 상태에서 데이터는 메모리 버퍼에 저장되지만, 메모리 버퍼는 디스크에 저장되지 않는다.
  3. Committed (커밋)
    • 이 상태에서 모든 트랜잭션 변경사항들이 영구적으로 데이터베이스에 저장된다.
    • 이 지점을 지나면 트랜잭션을 되돌릴 수 없다.
  4. Failed (실패)
    • 활성 상태 또는 부분 커밋 상태에서 트랜잭션이 실패하거나 중단되면 트랜잭션은 실패 상태가 된다.
  5. Terminated state (제거 상태)
    • 커밋 또는 실패 상태 다음의 마지막 트랜잭션 상태이다.
    • 이 상태는 데이터베이스 트랜잭션 라이프 사이클의 마지막이 된다.

참고

profile
캐비지 개발 블로그입니다. :)

0개의 댓글