트랜잭션이란?

DB에서 하나의 작업단위라고 설명할 수 있습니다

대표적인 예시를 들면 부모님이 자식에게 은행 이체를 통해 돈을 보내주려고 할 때

진행순서 ( DB를 기준으로 )

  1. 은행 계좌 정보를 select를 통해 검색
  2. 계좌 정보가 있다면 부모님 계좌 update -1,000,000원
  3. 계좌 정보가 있다면 자식 계좌 update +1,000,000원
  4. 이후에 추가적인 부분이 발생할 수 있음

이때 어디선가 장애가 발생해서 하나의 작업이라도 취소가 되었다면 이체라는 작업이 수행되지 않은 것이나 다름없기에

계좌 이체라는 하나의 작업단위

 

정의

  • 업무 처리의 논리적 단위
  • 하나의 건수로 처리되어야 하는 분리될 수 없는 연산 집합
  • All or Nothing

트랜잭션의 특성

위 예시처럼 하나의 트랜잭션 단위를 유지하며 실행하기 위해 만족시켜야하는 특성

ACID → 트랜잭션이 성공적으로 실행되기 위해 반드시 만족해야 하는 성질

  • 원자성 Atomicity ⇒ 나눠질 수 없다 All or Nothing
  • 일관성 Consistency ⇒ 트랜잭션 실행 전과 후에도 항상 일관성이 있어야 한다
  • 격리성 Isolation ⇒ 트랜잭션 실행 중 연산의 중간결과를 다른 트랜잭션이 접근 할 수 없다
  • 영속성 Durability ⇒ 트랜잭션이 일단 성공적으로 실행되면 그 결과는 영속적

 

 

 

트랜잭션 처리

실제로 트랜잭션 단위로 처리하기 위해 고려해봐야 할 부분 3가지

장애와 회복 그리고 병행제어

1) 장애

DB에서 시스템 장애 (하드웨어 오작동) , 미디어 장애(저장 미디어 붕괴)가 있지만

트랜잭션 장애가 DB를 사용하면서 발생한 장애 중 99%를 차지함

트랜잭션 장애란?

 

  • 논리적 오류
  • 입력 데이터 불량
  • 시스템 자원 과다 사용

등등이 원인

 

 

2) 회복

회복에 대한 부분은 DBMS에 따라 다르고 깊게 들어가면 상당히 복잡해짐(DBMS의 성능에 영향)

⇒ 회복 동작의 기본적인 실행 단위

commit과 rollback 그리고 REDO(재실행)와 UNDO(취소) 회복 단위

  • 회복 기법중 하나인 검사시점 회복

로그: 트랜잭션의 단위로 작성한 하나의 트랜잭션 저장 기록( 실제로 트랜잭션이 commit 되었는지 아닌지가 적혀있다 → 트랜잭션이 실행이 완료되었는지 아닌지 )

검사 시점 이후로 로그를 확인하면서 UNDO와 REDO를 반복함

 

 

 

3) 병행제어

DB를 사용하는 목적인 정확성과 공용성을 만족시키기 위해 필요함.

 

병행제어가 되지 않는다면? → 충돌이 발생함 → 충돌이 발생하면?

  • 데이터의 모순성
  • 성능 저하 ( 회복작업을 위한 연쇄 복귀 등등..)
  • 의도치 않는 결과가 발생가능
  • 갱신 분실

충돌(conflict)을 관리하는 것이 중요함

 

예시로써 위 트랜잭션에서 select문으로 계좌 잔액 검색을 할 때 혹시라도 다른 트랜잭션 작업에서 돈이 이체 된다면?

하지만 이렇게 충돌이 절대 발생하지 않도록 해야하는 작업이 있는가하면 충돌이 일어나도 별 상관없는 작업들이 있습니다. 이러한 작업을 수행할 때 트랜잭션이 충돌하지 않도록 한다면 효율적이지 못할 수가 있습니다.

 

 

트랜잭션 격리 수준

격리 수준이 높으면 충돌이 발생하진 않지만 트랜잭션 처리 속도가 낮아질 수 있음.

격리 수준이 낮으면 충돌이 많이 발생하지만 처리 속도가 빠름.

따라서 DB의 특성에 따라서 어떤 격리 수준을 가질지 생각해봐야 하고 DB의 성능에 중요한 영향을 끼침

 

[DB] 트랜잭션 격리 수준(Transaction Isolation Level)

 

[DB] 트랜잭션 격리 수준(Transaction Isolation Level)

개념 트랜잭션 격리수준(isolation level)이란 동시에 여러 트랜잭션이 처리될 때, 트랜잭션끼리 얼마나 서로 고립되어 있는지를 나타내는 것이다. 즉, 특정 트랜잭션이 다른 트랜잭션에 변경한 데

dar0m.tistory.com

https://www.youtube.com/watch?v=e9PC0sroCzc

 

'TIL > 개념정리' 카테고리의 다른 글

React-query useMutation 간단히 사용해보고 정리  (0) 2022.08.18
Git, Github 정리  (0) 2022.07.29
Nginx와 apache가 무엇인지  (0) 2022.07.21
swagger가 필요한 이유와 정리  (0) 2022.07.19
API 쉽게 이해하기  (0) 2022.07.19
복사했습니다!