GitHub

https://github.com/Choidongjun0830

CS

4.3 트랜잭션과 무결성

gogi masidda 2024. 9. 24. 13:21

'면접을 위한 CS 전공지식 노트' 책을 보며 공부한 내용입니다.

트랜잭션

데이터베이스에서 하나의 논리적인 기능을 수행하기 위한 작업의 단위

 => 데이터베이스에서 접근 방법은 쿼리 => 여러개의 쿼리들을 하나로 묶는 단위

이에 대한 특징은 원자성, 일관성, 독립성, 지속성이 있다. 이를 한꺼번에 ACID라고 한다.

 

  • 원자성(atomicity)
    • 트랜잭션과 관련된 일이 모두 수행되었거나 되지 않았거나를 보장
    • ex) 트랜잭션을 커밋했는데, 문제가 발생하여 롤백하는 경우. 그 이후에 모두 수행되지 않음을 보장하는 것.
    • 트랜잭션 단위로 여러 로직들을 묶을 때 외부 API 호출이 있으면 안된다. 만약 있다면, 롤백이 일어났을 때 어떻게 할 것인지에 대한 해결 방법이 있어야 하고, 트랜잭션 전파를 신경써서 관리해야 한다.
    • 커밋과 롤백
      • 커밋은 여러 쿼리가 성공적으로 처리되었다고 확정하는 명령어이다.
        • 트랜잭션 단위로 수행되며 변경된 내용이 모두 영구적으로 저장되는 것이다.
      • 롤백은 트랜잭션을 처리한 하나의 묶음 과정을 일어나기 전으로 돌리는 것이다.
      • 커밋과 롤백 덕분에 데이터의 무결성이 보장된다. 
    • 트랜잭션 전파
      • 트랜잭션을 수행할 때 커넥션 단위로 수행한다.
      • => 커넥션 객체를 넘겨서 수행해야 한다.
      • 하지만 이를 매번 넘겨주기가 어렵고 귀찮은데 이를 넘겨서 수행하지 않고 여러 트랜잭션 관련 메서드의 호출을 하나의 트랜잭션에 묶이도록 하는 것을 트랜잭션 전파라고 한다.
        • Spring 프레임워크에서 @Transactional을 통해 여러 쿼리 관련 코드를 하나의 트랜잭션으로 처리하는 것
        • 물리 트랜잭션: 실제 데이터베이스에 적용되는 트랜잭션 단위
        • 논리 트랜잭션: 스프링이 트랜잭션 매니저를 통해 처리하는 트랜잭션 단위 
        • 모든 논리 트랜잭션이 커밋되어야 물리 트랜잭션이 커밋될 수 있다.
        • 이렇게 @Transactional은 여러개의 트랜잭션을 묶어 하나의 트랜잭션 경계를 만들 수 있다.
  • 일관성(consistency)
    • 허용된 방식으로만 데이터를 변경해야 하는 것
    • 데이터베이스에 기록된 모든 데이터는 여러가지 조건, 규칙에 따라 유효함을 가져야 한다.
    • 예시) A가 1000만원, B가 0원 보유 -> B가 A에게 500만원 송금은 불가
  • 격리성(isolation)
    • 트랜잭션 수행시 서로 끼어들지 않는 것.
    • 복수의 병렬 트랜잭션은 서로 격리되어 마치 순차적으로 실행되는 것처럼 작동해야 한다.
    • DB는 여러 사용자가 같은 데이터에 접근할 수 있어야 한다.
    • 그냥 순차적으로 하면 쉽지만, 그러면 성능이 떨어진다.
    • 격리 수준
      • SERIALIZABLE
        • 트랜잭션을 순차 실행
        • 여러 트랜잭션이 동시에 같은 행에 접근할 수 없다. 매우 엄격한 수준
        • 해당 행을 격리시키고 이후 이 행에 대한 트랜잭션이 있으면 대기한다.
        • 하지만 교착 상태가 있을 수도 있다.
      • REPEATABLE_READ
        • 하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없게 막아주지만, 새로운 행 추가는 막지 않는다.
        • 따라서 이후에 추가한 행이 별견될 수도 있다.
        • MySQL 8.0dml innoDB 기본 값이다. 
        • 팬텀리드 발생
      • READ_COMMITED
        • 가장 많이 사용되는 격리 수준
        • PostgreSQL, SQL server, 오라클에서 기본 값으로 사용된다.
        • 트랜잭션에서 커밋되지 않은 정보는 볼수 없다. => 커밋된 정보만 볼 수 있다. 
        • 하지만, 어떤 트랜잭션이 접근한 행을 다른 트랜잭션이 수정 가능하다. => 다시 읽을 때 값이 달라질 수도 있다. 
        • 팬텀리드, 반복가능하지 않은 조회 발생
      • READ_UNCOMMITED
        • 가장 낮은 격리 수준이다.
        • 커밋되기 전에도 다른 트랜잭션에 노출되지만, 가장 빠르다.
        • 몇몇 행이 제대로 조회가 안되어도 어림잡아 거대한 양을 집계하는데는 좋다. 
          • 팬텀리드, 반복가능하지 않은 조회, 더티 리드 발생
      • 아래로 갈수록 격리 수준은 약해지지만, 동시성은 강해진다.
      • 팬텀리드
        • 한 트랜잭션 내에서 동일한 쿼리를 보냈을 때, 해당 조회 결과가 다른 경우
        • 예시) A가 age 12 이상인 회원 조회 -> 세개의 결과
          • 이후, B가 age 15인 회원 추가 -> 이제 4개의 결과
          • 이렇게 조회 결과가 달라지는 경우
      • 반복 가능하지 않은 조회
        • 한 트랜잭션 내의 같은 행에 두번 이상 조회가 발생했는데, 그 값이 다른 경우
        • 예시) 첫 조회와 두번째 조회 사이에 값이 변경되는 경우.
      • 더티 리드
        • 한 트랜잭션이 실행 중일때, 다른 트랜잭션에 의해 수정되었지만 '아직 커밋되지 않은' 행의 데이터를 읽을 수 있을 때 발생한다. 
  • 지속성(durability)
    • 성공적인 트랜잭션은 영원히 반영되어야 한다. 
    • => 장애 발생시 복구
    • DB는 이를 위해서 체크섬, 저널링, 롤백 등의 기능을 제공한다.
      • 체크섬: 중복 검사의 한 형태, 오류 정정을 통해 송싱된 자료의 무결성 보장
      • 저널링: 로그 기록, 커밋되기 전에 로깅, 트랜잭션 등 변경 사항에 대해 로깅

 

무결성

데이터의 정확성, 일관성, 유효성을 유지하는 것

 

  • 개체 무결성
    • 기본 키로 선택된 필드는 빈 값X
  • 참조 무결성
    • 서로 참조 관계에 있는 두 테이블의 데이터는 항상 일관된 값을 유지해야 한다.
  • 고유 무결성
    • 특정 속성에 대해 고유한 값을 가지도록 설정햇으면 그 속성은 모두 고유한 값을 가져야 한다.
  • NULL 무결성
    • 특정 속성에 대해 NULL 값이 올 수 없다는 조건을 설정했으면 그 속성 값은 NULL이 오면 안된다.
728x90

'CS' 카테고리의 다른 글

4.5 인덱스  (0) 2024.09.27
4.4 데이터베이스의 종류  (2) 2024.09.26
4.2 ER Diagram과 정규화 과정  (6) 2024.09.22
4.1 데이터베이스의 기본  (1) 2024.09.20
3.4 CPU 스케줄링 알고리즘  (1) 2024.09.19