[백엔드 로드맵 - DB] Transactions

Sierra·2022년 8월 9일
0

Backend-Roadmap

목록 보기
31/43
post-thumbnail
post-custom-banner

Intro

DB를 운용하다 보면 상당히 많이 듣는 개념이고, 실제로 백엔드 상에서 특정한 거래가 진행되었을 때 Transaction Code 등의 값을 통해 해당 Transaction에 대한 로그를 남긴다.

이번 포스팅에서는 Transaction 에 대해 다뤄 보도록 하겠다.

Transaction?

절대로 쪼갤 수 없는 일의 단위. 하나의 거래 단위이다. 가장 많은 예시를 드는 게 송금인데, A가 B에게 송금을 한다고 했을 때, A의 계좌에서는 출금이 되어야 하고 B의 계좌에는 입금이 되어야 한다.

만약 두 가지 작업 중 하나라도 문제가 생겼다면? 금융사고가 일어나게 된다. 이런 문제 때문에 두 가지 작업을 하나의 트랜잭션으로 묶는다. 트랜잭션으로 묶인 상황에서는 두 가지 작업이 하나의 작업으로 간주된다. 절대로 쪼갤 수 없는 작업이기 때문에 두 작업 중 하나라도 성립하지 않는다면 해당 거래는 무효로 처리된다.

만약 이러한 트랜잭션이 제대로 처리되었다면 commit 처리가 된다. 오류가 발생했다면 Rollback 처리 된다.

조건

ACID 조건에 대해 앞서 설명한 적 있다. ACID 조건을 충족해야 트랜잭션으로 인정된다.

  • Atomacity
  • Consistency
  • Isolation
  • Durability

해당 개념들에 대한 설명은 이전 포스팅을 참조 바란다.

특징

트랜잭션은 무정지성을 향상시킬 수 있다. OS등 서버에 장애가 발생하여 DB를 재가동 한 때에 장애 직전까지의 커밋 결과를 손실하지 않고 마치는 것이 가능하다.
트랜잭션은 반드시 로그를 남긴다. 중간에 에러가 나면 트랜잭션은 성립하지 않기 떄문에 결과가 남지 않는다. 즉 장애가 발생했을 때 DB를 재가동 하게 되면 남겨져있는 로그를 통해 마지막으로 성립 된 트랜잭션을 추적할 수 있고 데이터를 쉽게 복구시킬 수 있다.

과정

트랜잭션은 다섯가지 상태로 나뉜다.
먼저 트랜잭션이 시작되었다면 Active 상태가 된다. 성공 여부에 따라 Partially Commited 상태가 되거나 Failed 상태가 될 수 있다. 그 후 Commit 되거나 Rollback 됨에 따라 Committed, Aborted 상태로 변한다.

commit은 모든 작업을 정상적으로 처리하겠다고 확정하는 명령어다. 모든 과정이 오류가 없었다면, 트랜잭션의 과정을 종료하고 영구적으로 데이터를 DB에 저장한다.

Rollback은 중간에 에러가 생겼을 때 Transaction 이 시작했던 시점으로 데이터를 돌려버린다. 어떤 작업이 일어났든 중간에 작업이 실패했기에, 트랜잭션이 시작하기 전 상태로 돌려서 데이터의 손실을 방지한다.

savepoint라는 명령또한 존재하는데, 임시 저장과 같은 역할을 한다.
특정 부분에서 트랜잭션을 취소하기 위해 사용하는데, 이러한 세이브포인트를 통해 트랜잭션을 작게 분할하는 것이 가능하다.

스케쥴

  • 직렬 스케쥴
    • 순서대로 하나씩 트랜잭션을 실행하는 것. 트랜잭션이 하나씩 실행되므로 모순이 발생하지 않는다.
  • 직렬화 스케쥴
    • 트랜잭션들이 동시에 자료 접근 연산들을 교차하며 실행시키면서도 결과가 직렬 스케줄과 동일한 스케줄이다.
    • 병행 처리를 하지만, 적절한 제어 조치를 취함으로써 직렬성을 유지할 수 있다.

트랜잭션의 병행처리

실제로 DB엔 실시간으로 엄청난 요청들이 전송된다. 즉 직렬 스케쥴 만으로는 모든 요청을 제대로 처리하기 힘들다.
그러므로 병행처리를 통해 생길 수 있는 위험성을 최소화 해야 한다.
병행 처리의 문제점은 다음과 같다.

종류내역문제점
갱신 유실 문제두 트랜잭션이 동시에 동일한 자료를 갱신첫째 갱신이 유실
오류 읽기 문제갱신하는 도중에 다른 트랜잭션이 읽기낡은 자료 읽기
잘못된 요약두 자료를 갱신하는 도중에 읽기요약 결과 오류
무결성 제약조건두 자료의 제약 조건을 검사하지 않고 갱신일관성 위반

이러한 문제를 해결하기 위해 병행 제어가 필요하고 병행 제어를 통해 해결할 수 있는 문제는 다음과 같다.

  • 분실된 업데이트 문제
    • 두 개의 트랜잭션이 동일한 아이템에 접근하여 서로의 연산이 중첩될 때 결과적으로 올바르지 않은 값이 저장될 수 있다.
  • 임시 업데이트 문제
    • 한 트랜잭션이 값을 업데이트하다가 중간에 트랜잭션이 실패하였다. 하지만 롤백하기 이전에 다른 트랜잭션이 값을 읽게 되면 올바르지 않은 값을 읽는 것이다.
  • 잘못된 요약 문제
    • 한 트랜잭션이 aggregate 함수(Sum, Max, Min 등)를 실행하고 있는데, 다른 트랜잭션이 이 값들 중 하나를 업데이트하고 있을 때 aggregate 트랜잭션의 값이 업데이트되기 이전을 사용할 때이다.

이러한 병행 제어 기법에는 ACID 파트에서 언급했듯 Concurrency Control 기법들을 활용한다. Lock, MVCC와 같은 기법들을 통해 병행 제어를 처리한다.
뿐만 아니라 2단계 로킹 규약, 타임스탬프 순서 기법등이 존재한다.

Block Chain

블록체인은 트랜잭션을 블록 단위의 체인으로 저장하는 기술이다. 블록 구조를 살펴보면 헤더 다음으로 트랜잭션들이 여러개 붙어있다. 즉 블록체인은 특정한 데이터에 대한 트랜잭션들을 모아 블록으로 생성 후 연결 시켜 둔 것이라 할 수 있다.

트랜잭션은 이전 트랜잭션 출력을 새 트랜잭션 입력으로 참조하고, 모든 입력 비트코인 값을 새 출력으로 전달하는 구조다. 그리고 이러한 트랜잭션들은 장부 역할을 한다. 소유자 디지털 서명을 사용하여 값을 소비하는 비트코인의 각 금액에 대한 소유권 증명이 포함되어있고, 이 값들은 누구나 확인 할 수 있다.

블록은 트랜잭션의 집합을 블록 단위로 기록하며, 채굴 행위를 통해 특정 시간 단위로 발행된다. 즉 블록은 이전 블록의 해시 값을 포함하고 참여자들이 화패를 거래 한 거래내역, 채굴 난이도, 논스 등 다른 데이터 또한 포함하고 있다.

Outro

트랜잭션의 개념, 특징, 실행과정, 스케쥴링 및 병행처리에 필요한 제어 기법, 트랜잭션을 응용한 블록체인 기술에 대해 간단히 알아보았다.

다음 포스팅은 N + 1 Problem에 대해 다뤄 보도록 하겠다.

Reference

http://wiki.hash.kr/index.php/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98
https://mangkyu.tistory.com/30
https://medium.com/@kimjunyong/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8%EC%9D%98-%EC%A0%95%EC%9D%98%EC%99%80-%EA%B8%B0%EC%88%A0-%EB%B9%84%EC%A0%84%EA%B3%B5%EC%9E%90%EB%8F%84-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-%EA%B8%B0%EB%B3%B8%EC%A0%81-%EC%9D%B4%ED%95%B4-6706ebb43009
https://jhkang-tech.tistory.com/103
https://jerryjerryjerry.tistory.com/48

profile
블로그 이전합니다 : https://swj-techblog.vercel.app/
post-custom-banner

0개의 댓글