Transaction Part.2

Mixer·2022년 7월 8일
0

트랜잭션에 대해 직관적으로 접근해 이해해보자

카페 / 손님

사례 1

손님이 커피 주문 앱을 통해서 카페 라떼 두잔 선택 후 결제
⬇️
주문 진행 중
⬇️
네트워크 오류로 인하여 결제를 실패
⬇️
하지만, 손님이 주문한 주문이 데이터베이스 등록되고, 스탬프 2개 적립
⬇️
카페 입장에선 결제 실패했지만, 스탬프 2개 적립되었음

카페 : ? , 주문 정보 존재
손님 : 무료 커피, 결제 실패로 인해 금액 지출 X


사례 2

손님 주문 커피 결제 완료
⬇️
데이터 베이스 저장중 오류로 인해 데이터베이스 등록 실패
⬇️
하지만, 손님은 결제 완료 -> -4000
⬇️
가게 음료 주문 안했는데? -> 주문 정보 없음

카페 : +4000, 주문 정보 없음
손님 : -4000, 커피 받지 못함


사례 3

손님 커피 주문하여 데이터베이스 등록
⬇️
데이터베이스 등록 중 오류, 주문한 커피 수만큼의 스탬프 횟수가 업데이트 되지 않음
⬇️
가게: 주문 정보 존재
손님: 커피를 받았지만, 스탬프 적립은 되지 않음

셋의 공통점은 작업이 이루어지는 도중 한가지가 실패했지만, 작업이 완료되었음

-> 신뢰성이 깨지는 상황 발생

핵심

트랜잭션이 여러 개의 작업을 묶어서 트랜잭션이라 부르는게 아닌
물리적으로 여러 작업이 있지만 논리적으로 마치 하나의 작업으로 인식해서

All or Nothing(전부 성공하던지, 전부 실패하던지) 둘 중 하나로만 처리되어 작업이 종료되어야만 트랜잭션의 의미가 생긴다.

All or Nothing

트랜잭션 처리 방식은 애플리케이션에서 사용하는 데이터 무결성을 보장하는 핵심적인 역할을 한다

복습 겸 가장 중요한 개념

1. 원자성 (Atomicity)

트랜잭션에서의 원자성이란?
작업을 더 이상 쪼갤 수 없음을 뜻한다

사례3을 살펴보면, 커피 주문 작업과 스탬프 적립 횟수를 증가시키는 두 작업은
어떤 작업은 처리해도 되고, 어떤 작업은 처리하지 않아도 되는 식으로 쪼개어 처리할 수 없다.
즉, 논리적으로 커피 주문 작업과 스탬프 적립 횟수 증가 '하나의 작업'으로 인식해 All or Nothing 중에서 하나로만 처리되는 것이 보장되어야 한다.

2. 일관성 (Consistency)

일관성은?
트랜잭션이 에러없이 성공적으로 종료될 경우, 비즈니스 로직에서 의도하는대로 일관성 있게 저장되거나 변경되는 것을 의미한다.

사례3을 다시 예로 들자면,
주문한 커피의 수 만큼, 스탬프 적립 횟수가 증가한다는 비즈니스 로직에 맞게 저장&&변경 되어야한다.
-> 손님/ 커피 3잔 주문 -> 스탬프 적립횟수 +3 (의도한대로 작동)
-> 손님/ 커피 3잔 주문 -> 스탬프 적립횟수 +5 (의도한대로 작동x, 일관성 위배)

3. 격리성 (Isolation)

격리성은?
여러 개의 트랜잭션이 실행될 경우 각각 독립적으로 실행이 되어야 함을 뜻한다.

격리성은 CPU의 프로세스 처리 과정을 이해하고 있으면 이해가 쉽다

예를 들자면, 우리가 컴퓨터를 사용해 Intelli J로 작업을 하고 있고,
동시에 뮤직 애플리케이션으로 음악을 듣고 있다면, 우리 보았을때는 보이지 않지만
CPU에선 위 두 가지 프로세스를 아주 빠른 속도로 번갈아가면서 실행을 시키고 있는것이다

이처럼 데이터베이스 역시 성능 향상을 목적으로,
한 개 이상의 트랜잭션을 번갈아가면서 처리할 수 있는데, 이 경우 트랜잭션이
다른 트랜잭션에 영향을 주지 않고 독립적으로 실행이 되어야한다는 것이 '격리성' 이다

4. 지속성 (Durability)

지속성은?
트랜잭션이 완료되면 그 결과는 지속되어야 한다는 뜻이다
이렇게 말하면 솔직히 뭔소린가 싶은데

즉, 지속성은 데이터베이스가 종료되어도 데이터는 물리적인 저장소에 저장되 지속적으로 유지되어야 한다는 뜻


Commit && Rollback

트랜잭션을 설명할 때 꼭 챙겨야하는 commit and rollback

커밋과 롤백은 데이터베이스에서 사용되는 명령어이다

Commit

  • 커밋은 모든 작업을 최종적으로 데이터베이스에 반영하는 명령어로써 commit 명령을 수행하면
    변경된 내용이 데이터베이스에 영구적으로 저장된다
  • 만약 commit 명령을 수행하지 않으면 작업의 결과가 데이터베이스에 최종적으로 반영되지 않는다.
  • commit 명령을 수행하면 하나의 트랜잭션 과정은 종료하게 된다.

Rollback

  • 롤백은 작업 중 문제가 발생할 때, 트랜잭션 내에서 수행된 작업들을 취소한다
  • 즉, 트랜잭션 시작 이 전의 상태로 되돌아간다
profile
Minthug'life

0개의 댓글