CS전공지식 노트/5. DB

데이터베이스 #2 : 트랜잭션

berryberries 2023. 7. 29. 17:03

1) 트랜잭션

하나의 논리적 기능을 수행하기 위한 작업의 단위
한번에 모두 수행되어야 할 일련의 연산들
열개의 쿼리들을 하나로 묶는 단위

2) 트랜잭션 전파

어떤 트랜잭션 동작과정에서 다른 트랜잭션 실행시 어떻게 처리하는가에 대한 개념
여러 트랜잭션 관련 메소드의 호출을 하나의 트랜잭션에 묶이도록 하는 것
spring framework에서는 @Transactional  어노테이션을 사용해서 여러 쿼리를 트랜잭션으로 처리

 

1. 전파 속성, Propagation 속성

종류 설명
REQUIRED DEFAULT.
미리 시작된 트랜잭션 있으면 참여, 없으면 새로 시작
시작된 후 다른 트랜잭션 경계가 설정된 메소드 호출시 같은 트랜잭션으로 묶임
REQUIRED_NEW 항상 새로운 트랜잭션 시작.
진행중인 트랜잭션 보류하고 새로운 트랜잭션 진행
이전 트랜잭션과 다음 트랜잭션은 별도 동작.
SUPPORTS 이미 시작된 트랜잭션이 있으면 참여, 아니면 트랜잭션 없이 진행
NOT_SUPPORTED 트랜잭션 사용 안함, 진행중인 트랜잭션은 보류
MANDATORY 이미 시작된 트랜잭션 있으면 참여, 없으면 예외 발생
독립적으로 트랜잭선 진행하면 안되는 경우 사용
NEVER 트랜잭션 사용하지 않도록 강제, 진행중인 경우 예외 발생
NESTED 진행중인 트랜잭션 있을 때, 중첩 트랜잭션 시작
상위 트랜잭션은 하위트랜잭션에 영향을 주지만 그 반대는 영향 안줌

 

*스프링에서는 물리트랜잭션, 논리트랜잭션으로 나눈다.

물리 트랜잭션 : 트랜잭션 매니저를 통해 사용한 실제 DB 커넥션

논리 트랜잭션 : @Transactional 이 적용된 각각의 메서드 단위

 

3) 트랜잭션 격리수준

SERIALIZABLE

  • 가장 엄격한 격리수준.
  • 트랜잭션을 순차적으로 진행시킨다. -> 동시 처리성능이 떨어진다.
  • 여러 트랜잭션이 동일한 레코드에 접근 불가능
  • 가장 안전하지만 성능적으로 너무 떨어지기 때문에 극적으로 안전한 작업이 아닌경우 사용하면 안됨

REPEATABLE READ

  • 한 트랜잭션 내에서 동일한 결과 보장, 새로운 레코드 추가시 부정합이 생길 수 있다.
  • -> 팬텀리드가 발생할 수 있다. 
  • MVCC 덕분에 일반적인 조회상황에서는 팬텀리드가 발생안함 -> 나중에 추가된 트랜잭션을 무시하면 되니까.

READ COMMITED

  • 커밋을 완료한 데이터만 조회가능
  • 한 트랜잭션이 접근한 행을 다른 트랜잭션이 수정, 추가 할 수 있다.
  • -> 팬텀리드, 반복가능하지 않은 조회 발생가능
  • MySQL8.0, PostgreSQL, 오라클의 기본값

READ UNCOMMITED

  • 가장 낮은 격리수준
  • 트랜잭션이 커밋되기 전 다른 트랜잭션 접근 가능
  • -> 더티리드, 팬텀리드, 반복가능하지 않은 조회 발생 가능
  • 처리속도 가장 빠르다.
  • 데이터 무결성이 깨질수 있다.

4) 격리수준에 따라 발생하는 현상

팬텀리드

  • 한 트랜잭션 내에서 동일한 쿼리를 보냈을 때 해당 조회 결과가 다른 경우
  • 트랜잭션 도중 새로운 행 추가되면 안된다는 정합성에 어긋난다.
트랜잭션 A 가 실행(SELECT)하는 도중 트랜잭션 B(INSERT)가 실행됐다.
트랜잭션 B는 레코드를 하나 추가했는데 테이블을 조회해보면 행이 추가된 상태로 조회됨
-> 같은 쿼리를 진행했는데 조회되는 값이 다른 경우

 

반복가능하지 않은 조회

  • 한 트랜잭션 내의 같은 행에 두번 이상 조회가 발생했는데 그 값이 다른 경우

 

더디리드

  • 트랜잭션에 의해 데이터가 변경되었으나 커밋 되지 않은 상황에서 다른 트랜잭션에서 커밋 안된 데이터를 읽는 경우

 

5) 트랜잭션의 특징, ACID

Atomicity, 원자성

  • DB에 트랜잭션의 수행이 모두 반영되거나 아예 반영되지 않아야한다.
  • 트랜잭션을 커밋했는데 문제가 생겨 롤백하는 경우 롤백 이후의 트랜잭션은 모두 수행하면 안된다.
A가 B에게 입금을 했을 때, A는 -10,000원이 되어야 하고 B에게는 +10,000원이 되어야 하는데 둘중 하나만 처리됐다 하면 원자성을 위반했다고 말한다.

 

 

Consistency, 일관성 

  • 트랜잭션이 실행을 성공하면 일관성있는 db 상태로 유지해야 한다,
  • DB 제약조건에 만족하지 않을경우 트랜잭션이 중단된다
  • 즉, 허용된 방식으로만 데이터를 변경해야한다. -> DB에 저장된 데이터는 여러조건, 구칙에 따라 유효해야 하기 때문이다.
A가 B에게 입금을 해야하는데 A가 돈이 없는데 입금이 됐다? 일관성을 위반했다고 말한다.

 

Isolation, 격리성

  • 트랜잭션 수행 시 서로 끼어들지 못한다.
  • 복수의 병렬 트랜잭션은 서로 겨길되어 마치 순차 실행되는 것처럼 작동되어야 한다.

 

Durability, 지속성

  • 성공적으로 수행된 트랜잭션은 영원히 반영되어야 한다.
  • 시스템 장애가 일어나도 영구적으로 반영되어야한다 -> 원래상태로 복구 되어야 하는 회복 기능이 있어야 한다.

 

<출처>

https://mangkyu.tistory.com/299

 

[MySQL] 트랜잭션의 격리 수준(Isolation Level)에 대해 쉽고 완벽하게 이해하기

이번에는 트랜잭션 격리 수준(Isolation Level)에 대해 알아보도록 하겠습니다. 아래의 내용은 RealMySQL과 MySQL 공식 문서 등을 참고하여 작성하였으며, 모든 내용은 InnoDB를 기준으로 설명합니다. 해당

mangkyu.tistory.com

https://www.inflearn.com/course/%EA%B0%9C%EB%B0%9C%EC%9E%90-%EB%A9%B4%EC%A0%91-cs-%ED%8A%B9%EA%B0%95/dashboard

 

CS 지식의 정석 | 디자인패턴 네트워크 운영체제 데이터베이스 자료구조 - 인프런 | 강의

국내 1위 "면접을 위한 CS 전공지식노트" 저자의 디자인패턴, 네트워크, 운영체제, 데이터베이스 등 CS 지식 강의! CS 면접에 필요한 모든 개념과 최신 기출을 다룬다!, [사진] [사진] [실제 카카오

www.inflearn.com