[면접을 위한 CS 전공지식 노트] 데이터베이스 - 트랜잭션과 무결성

Yijun Jeon·2024년 2월 7일
0

CS 전공지식

목록 보기
19/21
post-thumbnail

💡 데이터베이스 란?

데이터베이스(DB, Database)는 일정한 규칙, 혹은 규약을 통해 구조화되어 저장되는 데이터의 모음

  • 실시간 접근과 동시 공유 가능

트랜잭션

💡 트랜잭션 이란?

트랜잭션(transaction)은 데이터베이스에 하나의 논리적 기능을 수행하기 위한 작업의 단위로, 여러 개의 쿼리들을 하나로 묶는 단위

  • ACID 특징을 가짐 - 원자성, 일관성, 독립성, 지속성

원자성

💡 원자성 (atomicity) 이란?

트랜잭션과 관련된 일이 모두 수행되었거나 되지 않았거나를 보장하는 특징 - "all or nothing"
👉 트랜잭션이 커밋했는데, 문제가 발생하여 롤백하는 경우 그 이후에 모두 수행되지 않음을 보장

트랜잭션 단위로 여러 로직들을 묶을 때 외부 API를 호출하는 것이 있으면 안 됨
만약 있다면 롤백시에 해결법과 트랜잭션 전파를 신경써서 관리해야 함

🔗 커밋 (commit) : 여러 쿼리가 성공적으로 처리되었다고 확정하는 명령어

  • 변경된 내용이 모두 영구적으로 저장됨

🔗 롤백 (rollback) : 트랜잭션으로 처리한 하나의 묶음 과정을 일어나기 전으로 돌리는 일(취소)

⭐️ 커밋과 롤벡 덕에 데이터의 무결성 보장 가능

  • 데이터 변경 전에 변경 사항 쉽게 확인 가능
  • 해당 작업을 그룹화 가능

🔗 트랜잭션 전파 : 여러 트랜잭션 관련 메서드의 호출을 하나의 트랜잭션에 묶이도록 하는 것

  • 트랜잭션을 수행할 때 커넥션 단위로 수행하는데, 커넥션 객체를 매번 넘겨서 트랜잭션을 수행하는 대신
  • 🖇️ Spring 프레임워크 예시
    • @Service
      @Transactional(readOnly = true)
      public class MemberService{
      	private final Member Repository memberRepository;
          
          public MemberService(MemberRepository memberRepository){
          	this.memberRepository = memberRepository;
      	}
      }

일관성

💡 일관성 (consistency) 이란?

'허용된 방식'으로만 데이터를 변경해야 하는 것

  • 데이터베이스에 기록된 모든 데이터는 여러 가지 조건, 규칙에 따라 유효함을 가져야 함
  • ex) 잔고 0원으로부터 500만원 송금 불가능

격리성

💡 격리성 (isolation) 이란?

트랜잭션 수행 시 서로 끼어들지 못하는 것

  • 복수의 병렬 트랜잭션은 서로 격리되어 마치 순차적으로 실행되는 것처럼 작동돼야 함
  • 데이터베이스는 여러 사용자가 같은 데이터에 접근할 수 있어야 함
  • 격리성은 여러 개의 격리 수준으로 나뉘어 격리성 보장

격리 수준

🔗 SERIALIZABLE : 트랜잭션을 순차적으로 진행

  • 여러 트랜잭션이 동시에 같은 행 접근 불가
  • 매우 엄격한 수준
  • 교착상태가 일어날 확률 ⬆️
  • 가장 성능이 떨어짐

🔗 REPEATABLE_READ

  • 하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없도록 막아줌
  • 다른 트랜잭션이 새로운 행을 추가하는 것은 막지 않음

🔗 READ_COMMITTED : 가장 많이 사용되는 격리 수준

  • 커밋 완료된 데이터에 대해서만 조회를 허용
  • 한 트랜잭션이 접근한 행을 다른 트랜잭션이 수정 가능
  • A가 수정하고 B가 다시 수정한 행을 A가 다시 읽을 때 다른 내용 발견 가능

🔗 READ_UNCOMMITTED : 가장 빠른 격리 수준

  • 가장 낮은 격리 수준
  • 하나의 트랜잭션이 커밋되기 이전에 다른 트랜잭션에 노출되는 문제가 있음
  • 거대한 양의 데이터를 '어림잡아' 집계하는 데 사용하면 좋음

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

🔗 팬텀 리드 (phantom read) : 한 트랜잭션 내에서 동일한 쿼리를 보냈을 때 해당 조회 결과가 다른 경우

  • 동일한 쿼리에 다른 이 선택될 수도 있음

🔗 반복 가능하지 않은 조회 (non-repeatable read) : 한 트랜잭션 내의 같은 행에 두 번 이상 조회 시, 그 값이 다른 경우

  • 동일한 쿼리에 같은 행의 다른 이 선택될 수도 있음

🔗 더티 리드 (dirty read) : 한 트랜잭션 실행 중에 아직 커밋되지 않은 행의 데이터를 읽을 수 있은 경우

  • 다른 트랜잭션에 의해 수정되었지만 커밋되지 않은 상태일 수 있음

지속성

💡지속성 (durability) 이란?

성공적으로 수행된 트랜잭션은 영원히 반영되어야 하는 것을 의미

  • DB에 시스템 장애가 발생하도 원래 상태로 복구하는 회복 기능이 있어야 함
    👉 이를 위해 체크섬, 저널링, 롤백 등의 기능 제공

체크섬 : 중복 검사의 한 형태로, 오류 정정을 통해 무결성 보호
저널링 : 변경 사항을 반영(commit)하기 전에 로깅하는 것, 트랜잭션 등 변경 사항에 대한 로그를 남기는 것


무결성

💡무결성 이란?

무결성이란 데이터의 정확성, 일관성, 유효성을 유지하는 것
👉 무결성이 유지되어야 DB의 값과 그 값에 해당하는 현실 세계의 값이 일치한다고 신뢰할 수 있음

🔗 무결성의 종류

이름설명
개체 무결성기본키로 선택된 필드는 빈 값을 허용하지 않음
참조 무결성서로 참조 관계의 두 테이블의 데이터는 항상 일관된 값 유지
고유 무결성고유한 값을 가지는 조건의 속성의 경우 그 속성 값은 모두 고유한 값을 가짐
NULL 무결성NULL이 올 수 없다는 조건의 속성의 경우 그 속성 값은 모두 NULL이 아님

0개의 댓글